Dijkstra #include<stdio.h> #define N 201 #define INF 0x7ffffff int map[N][N]; int mark[N]; int path[N]; int n; void Dij(int start) { int i,j,min,k,dis; for (i=0;i<n;i++) { path[i]=map[start][i]; mark[i]=0; } mark[start]=1; for (i=1;i<n;i++)//n-1个未mark的点 { min=INF; k=start; for (j=0;j<n;j++)//找出最小点 { if (!mark[j] && path[j]<min) { k=j; min=path[j]; } } mark[k]=1; for (j=0;j<n;j++)//加进k点后 修改path { dis=map[k][j]+path[k]; if(!mark[j] && dis<path[j]) path[j]=dis; } } } int main () { //freopen("1874.txt","r",stdin); int m,i,j,start,end,u,v,w; while(scanf("%d%d",&n,&m)!=EOF) { for (i=0;i<n;i++) { for (j=0;j<n;j++) map[i][j]=INF; } for (i=0;i<m;i++) { scanf("%d%d%d",&u,&v,&w); if (map[u][v]>w) map[u][v]=map[v][u]=w;//注意! 两点之间多条路 } scanf("%d%d",&start,&end); if (start==end) printf("0/n");//自己到自己是0 else { Dij(start); printf("%d/n",path[end]==INF? -1:path[end]); } } } Bellman_Ford #include <stdio.h> #define N 1002 #define INF 0x7ffffff struct { int s,e,w; }t[N]; int d[201]; void Bellman_Ford(int n,int m,int start) { int i,j; for (i=0;i<n;i++) d[i]=INF; d[start]=0; for (i=1;i<n;i++) { for (j=0;j<m;j++) { if (d[t[j].s]+t[j].w<d[t[j].e]) d[t[j].e]=d[t[j].s]+t[j].w; if (d[t[j].e]+t[j].w<d[t[j].s]) d[t[j].s]=d[t[j].e]+t[j].w; } } } int main () { //freopen("1.txt","r",stdin); int n,m,i,start,end; while(scanf("%d%d",&n,&m)!=EOF) { for (i=0;i<m;i++) scanf("%d%d%d",&t[i].s,&t[i].e,&t[i].w); scanf("%d%d",&start,&end); Bellman_Ford(n,m,start); printf("%d/n",d[end]==INF? -1:d[end]); } }