九度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 }