题目描述
这是一个小明认为很难的问题,快到五一长假了,小明突然想去旅游,但是他有一些想去的地方,他搜集了他想去的地方的路线信息,但是他搜集的信息太多了,因此他决定把制定路线的事情交给你(他的大管家)。为了描述方便,我们将他可能要经过的n个城市编号1,2,…, n,当然他要求他到目的地所需的时间最短。
输入
一共有t组数据,每组数据的第一行有两个正整数n, m,(n<=1000,m<=10000)分别表示城市的数量和路的条数,接下来m行,每行有三个整数a,b,c,(1=<a,b<=n ,0<c<100), 分别表示城市a和 城市b之间有一条路要花c的时间,最后一行的两个整数s,e,代表小明的起始点和目的地。
输出
输出一路上要花掉的时间,当然由于时间仓促,有可能搜集的信息不能到达目的地,这时请输出-1
样例输入
2
3 2
1 2 2
2 3 3
1 3
4 2
1 2 3
1 3 2
1 4
样例输出
5
-1
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int inf=0x3f3f3f3f;
int g[maxn][maxn],dist[maxn];
int p[maxn];
int n,m,t,a,b,c,s,e;
bool flag[maxn];
void dijkstra(int u){
for(int i=1;i<=n;i++){
dist[i]=g[u][i];
flag[i]=false;
if(dist[i]==inf){
p[i]=-1;
}
else p[i]=u;
}
dist[u]=0;
flag[u]=true;
for(int i=1;i<n;i++){
int temp=inf,t=u;
for(int j=1;j<=n;j++){
if(!flag[j]&&dist[j]<temp){
temp=dist[j];
t=j;
}
}
if(t==u) return ;
flag[t]=true;
for(int j=1;j<=n;j++){
if(dist[t]+g[t][j]<dist[j]&&!flag[j]){
dist[j]=dist[t]+g[t][j];
p[j]=t;
}
}
}
}
int main(){
while(~scanf("%d",&t)){
while(t--){
memset(g,inf,sizeof(g));
scanf("%d %d",&n,&m);
for(int i=0;i<m;i++){
scanf("%d %d %d",&a,&b,&c);
g[a][b]=min(g[a][b],c);
g[b][a]=min(g[b][a],c);//若有重边,取最小
}
scanf("%d %d",&s,&e);
dijkstra(s);
if(dist[e]!=inf)printf("%d\n",dist[e]);
else printf("-1\n");
}
}
}