#include<iostream>
#include<cstring>
#include<cstdio>
#define INF 0x3f3f3f
using namespace std;
int map[1005][1005];
int n,m,s,t;
void floyd()
{
int i,j,k;
cin>>s>>t;
for(k=0;k<=n-1;k++)//floyd核心步骤
for(i=0;i<=n-1;i++)
{
if(map[i][k]<INF)
{
for(j=0;j<=n-1;j++)
{
if(map[k][j]<INF&&map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}
if(map[s][t]<INF)
cout<<map[s][t]<<endl;
else
cout<<"-1"<<endl;
return ;
}
int main()
{
int i,j,u,v,w;
while(cin>>n>>m)
{
for(i=0;i<=n-1;i++)//初始化map[][]数组
for(j=0;j<=n-1;j++)
map[i][j]=INF;
for(i=0;i<=n-1;i++)//注意别少了这一步
map[i][i]=0;
/*
解释:如k=1,i=2,j=2;时
map[2][1]+map[1][2]<map[2][2]
就会对map[2][2]进行更新,其结果显然不为0,而
正常情况下,map[2][2]应为0
所以不能少了for(i=0;i<=n-1;i++)
map[i][i]=0;
这一步
*/
for(i=1;i<=m;i++)//输入数据
{
cin>>u>>v>>w;
if(map[u][v]>w)//防止两点之间出现多条路径的情况出现
{
map[u][v]=w;
map[v][u]=w;
}
}
floyd();
/*cin>>s>>t;
for(k=0;k<=n-1;k++)//floyd核心步骤
for(i=0;i<=n-1;i++)
{
if(map[i][k]<INF)
{
for(j=0;j<=n-1;j++)
{
if(map[k][j]<INF&&map[i][j]>map[i][k]+map[k][j])
map[i][j]=map[i][k]+map[k][j];
}
}
}*/
/*for(i=0;i<=n-1;i++)
{
for(j=0;j<=n-1;j++)
cout<<map[i][j]<<" ";
cout<<endl;
}*/
/*if(map[s][t]<INF)
cout<<map[s][t]<<endl;
else
cout<<"-1"<<endl;*/
}
return 0;
}
畅通工程续floyd
最新推荐文章于 2020-07-25 17:07:38 发布