弗洛伊德算法是解决任意两点间最短路径的一种算法,可以处理有向图或负权边问题。
#include<stdio.h>
#include<string.h>
#define inf 1<<28
#define qmin(a,b) a<b?a:b
int mp[110][110];
int dis[110][110];
void fld(int n,int s)
{
int i,j,k;
//初始化
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
dis[i][j]=mp[i][j];
//起点i,终点j,中间点k。从i到j,有经过k和不经过k两种情况,
//取两种情况中权值最小的
for(k=1;k<=n;k++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
dis[i][j]=qmin(dis[i][j],dis[i][k]+dis[k][j]);
}
printf("%d\n",dis[s][n]);
}
int main()
{
int n,m,i,j;
int a,b,c;
while(scanf("%d%d",&n,&m),n||m)
{
//初始化
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
mp[i][j]=i==j?0:inf;
for(i=0;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
//取最小权值
if(mp[a][b]>c)
{
mp[a][b]=c;
mp[b][a]=c;
}
}
fld(n,1);//传递点数和起点
}
return 0;
}