又一个套了FLOYD的模板题 = = 感觉已经可以十分钟敲一个模板了。没啥好说的。
注意的坑就是 是否重边,开始与终点是否一致。
简单粗暴十分钟over = =
(前提如果我么有在输入数据的时候手残多敲了一个百分号..导致自己在循环里面的数据调试了十多分钟的话,说多了都是泪啊
31ms 搓搓代码(现在不能再用FLOYD了诶..懒懒的,要用dijsktra 把这些基础题再滚一次 = =
/*
* HDU - 1874 - 畅通工程续 - 最短路
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#include<cmath>
using namespace std;
const int MAXN = 200+5;
const int INF = 1<<27;
int path[MAXN][MAXN];
int maxi;
void Floyd(int &n)
{
for( int k = 0; k <= maxi ;++k )
for( int i = 0; i <= maxi ;++i )
if( path[i][k]!=INF )//优化 减少次数
for( int j = 0; j <= maxi ;++j)
{
if( path[i][j] > path[i][k] +path[k][j])
path[i][j] = path[i][k] +path[k][j];
}
}
int main()
{
// freopen("in.txt","r",stdin);
int n,m;
int s,t;
while ( ~scanf("%d%d",&n,&m) )
{
for( int i = 0; i < MAXN ; ++i )
for( int j = 0; j < MAXN ; ++j)
path[i][j] = INF;
int a,b,link;
maxi = 0;
for( int i = 0; i < m ;++i)
{
scanf("%d%d%d",&a,&b,&link);
path[a][b] = path[b][a] = min(path[a][b],link);//重边
maxi = max( a,max(b,maxi));
// cout<<"该道路的长度:"<<path[a][b]<<endl;
}
scanf("%d %d",&s,&t);
if(s==t)puts("0");//开始与起点是否一致
else
{
Floyd(n);
if( path[s][t] != INF )printf("%d\n",path[s][t]);
else puts("-1");
}
}
return 0;
}