/*
Floyd:利用三个循环扫map[i][j]中是否存在中间节点k,能使map[i][j]<map[i][k]+map[k][j],存在就用后者取代前者。
这样,如果i与j存在最短路径,那么必然是i->k1->k2->......->km->j;这样中间的k的可能性在三循环中都扫了一遍。新的map[i][j]就表示i到j的最短路径了
*/
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
#define N 101
int map[N][N];
int n;
void Floyd()
{
for(int k=0;k<n;k++)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(map[i][j]>map[i][k]+map[k][j]) map[i][j]=map[i][k]+map[k][j];
}
}
}
}
int main()
{
int m,l,i,j,k;
while(cin>>n>>m)
{
if(n==0&&m==0) break;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++) map[i][j]=99999999;
}
for(i=0;i<m;i++)
{
cin>>j>>k>>l;
map[j-1][k-1]=l;
map[k-1][j-1]=l;
}
Floyd();
cout<<map[0][n-1]<<endl;
}
return 0;
}
最短路径Floyd算法模板
最新推荐文章于 2024-02-05 21:20:04 发布