图结构练习——最短路径(Bellman_ford)(HUD1874)

http://acm.hdu.edu.cn/showproblem.php?pid=1874

 

 1 #include<stdio.h>

 2 #include<string.h>

 3 const int maxn=1011;

 4 const int maxm=10011;

 5 const int oo=1<<28;

 6 

 7 struct node

 8 {

 9     int u,v,w,next;

10 }edge[maxm];

11 

12 int dis[maxn];

13 int cnt;

14 int n,m;

15 

16 void add(int u,int v,int w)

17 {

18     edge[cnt].u=u;

19     edge[cnt].v=v;

20     edge[cnt].w=w;

21     cnt++;

22 }

23 

24 bool bellman_ford(int s)

25 {

26     for(int i=0;i<n;i++)

27     {

28         dis[i]=oo;

29     }

30     dis[s]=0;

31     for(int i=0;i<n-1;i++)

32     {

33         for(int j=0;j<cnt;j++)

34         {

35             int u=edge[j].u;

36             int v=edge[j].v;

37             int w=edge[j].w;

38             if(dis[v]>dis[u]+w)

39             {

40                 dis[v]=dis[u]+w;

41             }

42         }

43     }

44     for(int j=0;j<cnt;j++)

45     {

46         int u=edge[j].u;

47         int v=edge[j].v;

48         int w=edge[j].w;

49         if(dis[v]>dis[u]+w)

50         return false;

51     }

52     return true;

53 }

54 

55 void init()

56 {

57     cnt=0;

58 }

59 

60 int main()

61 {

62     while(scanf("%d %d",&n,&m)!=EOF)

63     {

64         int u,v,w;

65         init();

66         for(int i=0;i<m;i++)

67         {

68             scanf("%d %d %d",&u,&v,&w);

69             add(u,v,w);

70             add(v,u,w);

71         }

72         scanf("%d%d",&u,&v);

73         bellman_ford(u);

74         if(dis[v]<oo)

75         printf("%d\n",dis[v]);

76         else

77         printf("-1\n");

78     }

79     return 0;

80 }
View Code

 

你可能感兴趣的:(最短路径)