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

你可能感兴趣的:(SPFA)