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];
}
}
}