HDU2066 一个人的旅行(SPFA)

这个题相比较于一般的SPFA,还多加了一步草儿的家与图上的一些点相连,且距离为0。所以我们用链式前向星先来储存不连接图中点与 草儿的家 的边,然后再储存连接图中点与 草儿的家 的边。然后用SPFA来找出每个点到草儿的家的对短距离就OK了。(多亏题目给的点是1到1000,这样就可以把 草儿的家 设为0)

下面是AC代码(因为题目没有考虑负环,所以就没有进行负环的判断):

 

#include 
#include 
#include 
#include 
#include 
using namespace std;
const int maxn = 10000;
const int MAX = 0xffffff;
struct stuff{
    int to;
    int len;
    int sign;
}road[maxn];
int id[maxn];
int d[maxn];
int vis[maxn];
int cnt;
void add(int from, int to, int lenth)
{
    road[cnt].to = to;
    road[cnt].len = lenth;
    road[cnt].sign = id[from];
    id[from] = cnt++;
}
void spfa()
{
    vis[0] = 1;
    queue q;
    q.push(0);
    d[0] = 0;
    //cout << "ah" << endl;
    while(!q.empty())
    {
        //cout << "ds" << endl;
        int t = q.front();
        q.pop();
        for(int i = id[t]; i != -1; i = road[i].sign)
        {
            if(d[road[i].to] > d[t] + road[i].len)
            {
                d[road[i].to] = d[t] + road[i].len;
                //printf("%d->%d is %d\n", t, road[i].to, d[road[i].to]);
                if(!vis[road[i].to])
                {
                    vis[road[i].to] = 1;
                    q.push(road[i].to);
                }
            }
        }
    }
}
int main()
{
    int T,S,D;
    while(scanf("%d%d%d", &T,&S,&D) != EOF)
    {
        int i, a, b, r;
        cnt = 0;
        for(i=0; i

 

 

 

 

 

你可能感兴趣的:(ACM)