Floyd+路径输出

#include <iostream> 
using namespace std; 
#include <stack>
const int INF = 99999999; 
stack<int>s;
int n,m;//n:顶点数,m:边数 

struct node 
{ 
int space; 
int pre; 
}map[110][110];//建图,map[i][j].space表示点i到点j的最短距离,map[i][j].pre表示点i到点j的"跳板" 

void input() 
{ 
int i,j; 
for(i = 1; i <=n; i++) 
for(j = 1; j <=n; j++) 
{ 
if(i==j) map[i][j].space = 0; 
else map[i][j].space = INF; 
map[i][j].pre = i; 
}//初始化 
int a,b,x; 
for(i = 1; i <=m; i++) 
{ 
cin>>a>>b>>x; 
map[a][b].space = x; 
}//存图 
} 

void floyd()//floyd算法 
{ 
int k,i,j; 
for(k = 1; k <=n; k++) 
for(i = 1; i <=n; i++) 
for(j = 1; j <=n; j++) 
{ 
if(map[i][k].space!=INF && map[k][j].space!=INF && map[i][k].space + map[k][j].space < map[i][j].space) 
{ 
map[i][j].space = map[i][k].space + map[k][j].space; 
map[i][j].pre = k; 
} 
} 
} 

void output() 
{ 
int i,j; 
for(i = 1; i <=n; i++) 
for(j = 1; j <=n; j++) 
{ 
cout<<i<<"~"<<j<<"的最短距离:"<<map[i][j].space<<endl; 
int k = j; 
cout<<"路径:"<<i<<" "; 

while(map[i][k].pre!=i) 
{ 
k = map[i][k].pre; 
s.push(k); 
} 
while(!s.empty())
{
cout<<s.top()<<" "; 
s.pop();
} 
cout<<j<<" \n"; 
} 
} 

int main() 
{ 
while(1) 
{ 
cin>>n>>m; 
if(n+m==0)break; 
input(); 
floyd(); 
output(); 
} 
return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值