#include <cstdio> #include <cstdlib> #include <cstring> const int max=1000000; int main() { int N,M; while (scanf("%d",&N)!=EOF) { int i,j; int x,y,dis; int d[200][200]; int result[200]={0}; int record[200]={0}; int s,e; for (i=0;i<=N-1;i++) for (j=0;j<=N-1;j++) d[i][j]=max; for (i=0;i<=N-1;i++) d[i][i]=0; scanf("%d",&M); for (i=0;i<=M-1;i++) { scanf("%d%d%d",&x,&y,&dis); if (d[x][y]>dis) { d[x][y]=dis; d[y][x]=dis; } } scanf("%d%d",&s,&e); record[s]=1; for (i=0;i<=N-1;i++) { result[i]=d[s][i]; } int pos=s; int min; while (pos!=e) { min=max; for (i=0;i<=N-1;i++) { if (!record[i] && result[i]<min) { min=result[i]; pos=i; } } record[pos]=1; if (min==max) break; for (i=0;i<=N-1;i++) { if (!record[i] && min+d[pos][i]<result[i]) { result[i]=min+d[pos][i]; } } } if (result[e]==max) printf("-1\n"); else printf("%d\n",result[e]); } return 0; }
上面是Dijskra算法
Bellman-Ford:
#include <iostream> #include <cstdio> using namespace std; int main() { int n,m; const int maxn=10000000; while (scanf("%d",&n)!=EOF) { int i,j,k; int s,e; int x,y,dis; int d[500][500]; int dist[500]; for (i=0;i<=n-1;i++) for (j=0;j<=n-1;j++) { if (i==j) d[i][j]=0; else d[i][j]=maxn; } scanf("%d",&m); for (i=0;i<=m-1;i++) { scanf("%d%d%d",&x,&y,&dis); if (dis<d[x][y]) { d[x][y]=dis; d[y][x]=dis; } } scanf("%d%d",&s,&e); for (i=0;i<=n-1;i++) dist[i]=d[s][i]; for (i=2;i<=n;i++) { for (j=0;j<=n-1;j++) { if (j!=s) { for (k=0;k<=n-1;k++) { if (dist[j]>dist[k]+d[k][j]) dist[j]=dist[k]+d[k][j]; } } //for (k=0;k<=n-1;k++) //printf("%d ",dist[k]); //printf("\n"); } } if (dist[e]==maxn) printf("-1\n"); else printf("%d\n",dist[e]); } return 0; }
Floyd:
#include <iostream> #include <cstdio> using namespace std; int main() { int max=1000000; int n; while (scanf("%d",&n)!=EOF) { int d[200][200]; int m; scanf("%d",&m); int i,j,k; for (i=0;i<=n-1;i++) for (j=0;j<=n-1;j++) { if (i==j) d[i][j]=0; else d[i][j]=max; } int s,e; for (i=0;i<=m-1;i++) { int dis,x,y; scanf("%d%d%d",&x,&y,&dis); if (d[x][y]>dis) { d[x][y]=dis; d[y][x]=dis; } } scanf("%d%d",&s,&e); for (k=0;k<=n-1;k++) for (i=0;i<=n-1;i++) for (j=0;j<=n-1;j++) if (d[i][k]+d[k][j]<d[i][j]) d[i][j]=d[i][k]+d[k][j]; if (d[s][e]==max) printf("-1\n"); else printf("%d\n",d[s][e]); } return 0; }
SPFA:
#include <cstdio> #include <iostream> #include <queue> using namespace std; int main() { const int maxn=100000000; int N,M; while (scanf("%d",&N)!=EOF) { scanf("%d",&M); queue<int> Q; int i,j; int s,e; int a,b,dis; bool visit[200]={false}; int A[200][200]; int d[200]; for (i=0;i<=N-1;i++) d[i]=maxn; for (i=0;i<=N-1;i++) for (j=0;j<=N-1;j++) A[i][j]=maxn; for (i=0;i<=M-1;i++) { scanf("%d%d%d",&a,&b,&dis); if (dis<A[a][b]) A[a][b]=A[b][a]=dis; } scanf("%d%d",&s,&e); d[s]=0; visit[s]=true; Q.push(s); while (!Q.empty()) { int temp=Q.front(); Q.pop(); for (i=0;i<=N-1;i++) { if (d[temp]+A[temp][i]<d[i]) { d[i]=d[temp]+A[temp][i]; if (!visit[i]) { Q.push(i); visit[i]=true; } } } visit[temp]=false; } if (d[e]!=maxn) printf("%d\n",d[e]); else printf("-1\n"); } return 0; }