Floyd算法解决有权图多源最短路径问题,下面上模板。
#include <iostream>
#include <cstring>
#define MAX 100
using namespace std;
int map[MAX][MAX];
int path[MAX][MAX];
int N;
//关键: 找中转点,然后比较
void Floyd()
{
memset(path,-1,sizeof(path));
for(int k = 1;k <= N;k++) //搜索中转点
for(int i = 1;i <= N;i++) //遍历图
for(int j = 1;j <= N;j++)
{
if(map[i][k] + map[k][j] < map[i][j]) //若i到k的距离+k到j的距离比i到j的距离小,则k就是中转点
{
map[i][j] = map[i][k] + map[k][j];
path[i][j] = k; //记录路径
}
}
}
//路径走法: path[i][j] = k k表示i到j的第一个中转点, path[k][j] = k1 k1表示k到j的第一个中转点,也就是i到j的第二个中转点,因此递推
void print(int s, int e) //输出路径
{
int k = path[s][e];
while(k != -1)
{
cout<<k<<endl;
k = path[k][e];
}
}
int main()
{
memset(map, 0x3f, sizeof(map)); //快速初始化无穷大
int M, x, y, z;
cin>>N>>M;
while(M--)
{
cin>>x>>y>>z;
map[x][y] = z;
// map[y][x] = z; 无向图加上这条语句
}
Floyd();
int s, e;
cin>>s>>e;
if(map[s][e] == 0x3f3f3f3f) cout<<"无通路!"<<endl;
else
{
cout<<s<<endl;
print(s, e);
cout<<e<<endl;
cout<<"长度为: "<<map[s][e]<<endl;
}
return 0;
}