poj 3259Wormholes (spfa 、bell)

http://poj.org/problem?id=3259

看了好久才知道那个虫洞 是可以把人带回去 而且时间也会回到过去 判断是否有负权回路  spfa看是否有一个点进入队列等于n次

bell-ford

View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<string.h>
 4 #include<queue>
 5 #define INF 0x3f3f3f
 6 using namespace std;
 7 struct node
 8 {
 9     int u,v,t;
10 }q[5000];
11 int dis[501];
12 int bellford(int n,int m)
13 {
14     int i,j;
15     memset(dis,0,sizeof(0));
16     for(i = 1; i <= n ; i++)
17     {
18         int flag = 0;
19         for(j = 1 ; j <= m ; j++)
20         if(dis[q[j].v]>dis[q[j].u]+q[j].t)
21         {
22             dis[q[j].v] = dis[q[j].u]+q[j].t;
23             flag = 1;
24         }
25         if(!flag)
26         break;
27     }
28     for(j = 1; j <= m ; j++)
29     {
30         if(dis[q[j].v]>dis[q[j].u]+q[j].t)
31             return 1;
32     }
33     return 0;
34 }
35 int main()
36 {
37     int i,j,k,n,m,t,w1,o,a,b,c;
38     scanf("%d",&t);
39     while(t--)
40     {
41         scanf("%d%d%d",&n,&m,&w1);
42         o = 0;
43         for(i = 1 ; i <= m ; i++)
44         {
45             scanf("%d%d%d",&a,&b,&c);
46             o++;
47             q[o].u = a;
48             q[o].v = b;
49             q[o].t = c;
50             o++;
51             q[o].u = b;
52             q[o].v = a;
53             q[o].t = c;
54         }
55         for(i = 1 ; i <= w1 ; i++)
56         {
57             scanf("%d%d%d",&a,&b,&c);
58             o++;
59             q[o].u = a;
60             q[o].v = b;
61             q[o].t = -c;
62         }
63        if(bellford(n,o))
64        printf("YES\n");
65        else
66        printf("NO\n");
67     }
68     return 0;
69 }
View Code
 1 #include <iostream>
 2 #include<cstdio>
 3 #include<string.h>
 4 #include<queue>
 5 #define INF 0x3f3f3f
 6 using namespace std;
 7 struct node
 8 {
 9     int v,w,next;
10 }men[30000];
11 int first[501],t,f[501],dis[501],c[501];
12 void init()
13 {
14     t = 0;
15     memset(first,-1,sizeof(first));
16 }
17 void add(int u,int v,int w)
18 {
19     men[t].v = v;
20     men[t].w = w;
21     men[t].next = first[u];
22     first[u] = t;
23     t++;
24 }
25 void spfa(int n)
26 {
27     int i,j,k,flag = 1;
28     memset(f,0,sizeof(f));
29     memset(c,0,sizeof(c));
30     queue<int>q;
31     for(i = 1; i <= n ; i++)
32     dis[i] = INF;
33     dis[1] = 0;
34     q.push(1);
35     f[1] = 1;
36     c[1] = 1;
37     while(!q.empty())
38     {
39         k = q.front();
40         if(c[k]==n)
41         {
42             flag = 0;
43             break;
44         }
45 
46         q.pop();
47         f[k] = 0;
48         for(i = first[k];i!=-1 ; i = men[i].next)
49         {
50             if(dis[k]+men[i].w<dis[men[i].v])
51             {
52                 dis[men[i].v]=dis[k]+men[i].w;
53                 if(!f[men[i].v])
54                 {
55                     f[men[i].v] = 1;
56                     q.push(men[i].v);
57                     c[men[i].v]++;
58                 }
59             }
60         }
61     }
62     if(!flag)
63     printf("YES\n");
64     else
65     printf("NO\n");
66 }
67 int main()
68 {
69     int i,j,k,n,m,a,b,c,w,p;
70     scanf("%d",&p);
71     while(p--)
72     {
73         scanf("%d%d%d",&n,&m,&w);
74         init();
75         for(i = 1; i <= m ; i++)
76         {
77             scanf("%d%d%d",&a,&b,&c);
78             add(a,b,c);
79             add(b,a,c);
80         }
81         for(i = 1; i <= w ; i++)
82         {
83             scanf("%d%d%d",&a,&b,&c);
84             add(a,b,-c);
85         }
86         spfa(n);
87     }
88     return 0;
89 }

spfa

posted @ 2012-08-08 14:25  _雨  阅读(213)  评论(0编辑  收藏  举报