九度1341的三种做法 bellman-ford spfa-dfs spfa-bfs

 1 #include<stdio.h>
 2 #include<iostream>
 3 #include<string.h>
 4 #define INF 0xffffff
 5 using namespace std;
 6 int i,j,k,start,dest,dist[102],n,m,edge[102][102],v,pre[102];
 7 bool bellman_ford()
 8 {
 9     memset(pre,0,sizeof(pre));
10     for(k=1;k<=n;k++)dist[k]=edge[start][k];
11     for(k=1;k<=n;k++)
12     {
13         for(i=1;i<=n;i++)for(j=1;j<=n;j++)
14         if(dist[i]>edge[j][i]+dist[j])
15         dist[i]=edge[j][i]+dist[j],pre[i]=j;
16     }
17     for(i=1;i<=n;i++)for(j=1;j<=n;j++)
18     if(dist[i]>dist[j]+edge[j][i]) return 0;
19     return 1;
20 }
21 int main()
22 {
23     while(~scanf("%d%d",&n,&m))
24     {
25         scanf("%d%d",&start,&dest);
26         for(i=1;i<=n;i++)
27         {
28             for(j=1;j<=n;j++)edge[i][j]=INF;
29             dist[i]=INF;
30         }
31         for(k=1;k<=m;k++)
32         {
33             scanf("%d%d%d",&i,&j,&v);
34             edge[i][j]=edge[i][j]<v?edge[i][j]:v;
35             edge[j][i]=edge[i][j];
36         }
37         if(bellman_ford())printf("%d\n",dist[dest]);
38     }
39 return 0;
40 }
 1 //ac
 2 #include<stdio.h>
 3 #include<iostream>
 4 #include<string.h>
 5 #include<queue>
 6 #define INF 0xffff
 7 using namespace std;
 8 int i,j,p,k,start,dest,dist[102],n,m,edge[102][102],v,pre[102];
 9 int  inq[102];
10 void spfa()
11 {
12     memset(pre,0,sizeof(pre));
13     memset(inq,0,sizeof(inq));
14     dist[start]=0;
15     queue<int>q;
16     q.push(start);
17     while(!q.empty())
18     {
19         p=q.front(),q.pop(),inq[p]=0;
20         for(i=1;i<=n;i++)
21         {
22             if(dist[p]+edge[p][i]<dist[i])
23             {
24                 dist[i]=dist[p]+edge[p][i];
25                 if(inq[i]==0)q.push(i),inq[i]=1;
26             }
27         }
28     }
29 }
30 int main()
31 {
32     while(~scanf("%d%d",&n,&m))
33     {
34         scanf("%d%d",&start,&dest);
35         for(i=1;i<=n;i++)
36         {
37             for(j=1;j<=n;j++)edge[i][j]=INF;
38             dist[i]=INF,edge[i][i]=0;
39         }
40         for(k=1;k<=m;k++)
41         {
42             scanf("%d%d%d",&i,&j,&v);
43             edge[i][j]=edge[i][j]<v?edge[i][j]:v;
44             edge[j][i]=edge[i][j];
45         }
46         spfa();
47         printf("%d\n",dist[dest]);
48     }
49 return 0;
50 }
 1 #define INF 0xffffff
 2 int i,j,k,l,edge[102][102],dist[102],instk[102],start,dest,n,m;
 3 void spfa(int k)
 4 {
 5     int i;
 6     instk[k]=1;
 7     for(i=1;i<=n;i++)
 8     {
 9         if(dist[k]+edge[k][i]<dist[i])
10         {
11             dist[i]=dist[k]+edge[k][i];
12             if(instk[i]==0)spfa(i);
13             else return;
14         }
15     }
16     instk[k]=0;
17 }
18 main()
19 {
20     while(~scanf("%d%d",&n,&m))
21     {
22         scanf("%d%d",&start,&dest);
23         for(i=1;i<=n;i++)
24         {
25             for(j=1;j<=n;j++)edge[i][j]=INF;
26             dist[i]=INF,instk[i]=0,edge[i][i]=0;
27         }
28         for(k=1;k<=m;k++)
29         {
30             scanf("%d%d%d",&i,&j,&l);
31             edge[i][j]=edge[i][j]<l?edge[i][j]:l;
32             edge[j][i]=edge[i][j];
33         }
34         dist[start]=0;
35         spfa(start);
36         printf("%d\n",dist[dest]);
37     }
38 }

 

posted on 2013-06-29 19:21  dokc  阅读(179)  评论(0编辑  收藏  举报

导航