for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(e[i][k]+e[k][j]<e[i][j]) { e[i][j]=e[i][k]+e[k][j]; } } } }
for(i=1;i<=n;i++) for(j=1;j<=n;j++) { if(i==j) e[i][j]=0; else e[i][j]=999999; } for(i=1;i<=m;i++) { scanf("%d %d %d",&x,&y,&v); e[x][y]=v; }
for(i=1;i<n-1;i++) { min=inf; for(j=1;j<=n;j++) { if(book[j]==0&&dis[j]<min) { min=dis[j]; u=j; } } book[u]=1; for(v=1;v<=n;v++) { if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v]) { dis[v]=dis[u]+e[u][v]; } } } }
for(k=1;k<=n-1;k++) { for(i=1;i<=m;i++) { if(dis[v[i]]>dis[u[i]]+w[i]) dis[v[i]]=dis[u[i]]+w[i]; } }
int flag=0; for(i=1;i<=m;i++) if(dis[v[i]]>dis[u[i]]+w[i]) flag=1; if(flag) printf("there are loop in the map!!");
#include<stdio.h> #include<string.h> #include<conio.h> int main() { int n,m,i,j,k; int u[8],v[8],w[8],e[100][100]={0}; int first[6],next[8]; int dis[6]={0},book[6]={0}; int que[101]={0},head=1,tail=1; int inf =99999; scanf("%d %d",&n,&m); for(i=1;i<=n;i++) dis[i]=inf; dis[1]=0; memset(book,0,sizeof(book)); for(i=1;i<=n;i++) first[i]=-1; for(i=1;i<=m;i++) { scanf("%d %d %d",&u[i],&v[i],&w[i]); e[u[i]][v[i]]=w[i]; //very beautiful solution //very important ! ! //就是一条边指向另一条边 next[i]=first[u[i]];//判断是否有与第i条边有相同节点的边,有的话就把该边赋给next[i] first[u[i]]=i;//把边的序号赋值给first的第节点个个的元素 } for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { printf("%5d",e[i][j]); } printf("\n"); } printf("\n"); for(i=1;i<=m;i++) printf("%d ",first[i]); printf("\n"); for(i=1;i<=m;i++) printf("%d ",next[i]); printf("\n"); que[tail]=1; tail++; book[1]=1; while(head<tail) { k=first[que[head]]; while(k!=-1) { if(dis[v[k]]>dis[u[k]]+w[k])//k代表第几条边 { dis[v[k]]=dis[u[k]]+w[k]; if(book[v[k]]==0) { que[tail]=v[k]; tail++; book[v[k]]=1; } } k=next[k]; } book[que[head]]=0; head++; } for(i=1;i<=n;i++) printf("%5d",dis[i]); getch(); return 0; }
for(i=1;i<=m;i++) { scanf("%d %d %d",&u[i],&v[i],&w[i]); e[u[i]][v[i]]=w[i]; //very beautiful solution //very important ! ! //就是一条边指向另一条边 next[i]=first[u[i]];//判断是否有与第i条边有相同节点的边,有的话就把该边赋给next[i] first[u[i]]=i;//把边的序号赋值给first的第节点个个的元素 }
5 7 //5个顶点,7条边
1 2 2
1 5 10
2 3 3
2 5 7
3 4 4
4 5 5
5 3 6
first[] | 2 4 5 6 7 7 5 |
next[] |
-1 1 -1 3 -1 -1 1
|
while(head<tail) { k=first[que[head]]; while(k!=-1) { if(dis[v[k]]>dis[u[k]]+w[k])//k代表第几条边 { dis[v[k]]=dis[u[k]]+w[k];//同bellman-ford算法思想 if(book[v[k]]==0) { que[tail]=v[k];//入队 tail++; book[v[k]]=1;//标记 } } k=next[k];//利用其找到有相同前节点的边的编号 } book[que[head]]=0;//出队,并标记 head++; }