Floyd
#include<stdio.h>
int main(){
int e[10][10],k,i,j,n,m,t1,t2,t3;
int inf=999999;
scanf("%d %d", &n,&m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(i==j)
e[i][j]=0;
else
e[i][j]=inf;
for(i=0;i<=m;i++){
scanf("%d %d %d",&t1,&t2,&t3);
e[t1][t2]=t3;
}
/*
floyd实质,最开始只允许经过1号顶点进行中转,接下来只允许经过1号和2号顶点进行中转......允许经过1~n号所有顶点进行中转,求任意两点之间的最短路程。
*/
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
for(i=1;i<=n;i++){
for(j=1;j<=n;j++){
printf("%10d",e[i][j]);
}
printf("\n");
}
return 0;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
dijkstra算法的基本思想:
每次找到离源点最近的一个点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径
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];
}
}
}