Description
有n个城市编号为1—n,m条路,告诉你每条路的长度,求给定两点的最短路径长度。
Input
T 组数据
每组数据第一行有两个正整数n,m(n<=1000,m<=10000)分别表示城市的数量和路的条数,接下来m行,每行3个整数a,b,c,表示城市a和城市b之间有一条c长度的路
最后一行输入两个整数x,y。
Output
输出城市 x 到城市 y 的最短路径。如果不存在输出-1。
Sample Input
2
3 2
1 2 2
2 3 3
1 3
4 2
1 2 3
1 3 2
1 4
Sample Output
5
-1
注释:输入的数据中存在重边,那么就要在输入的时候判断一下,取最小值,本题数据不是很大,所以代码不需要优化,用最原始的就行。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
const int inf=0x3f3f3f3f;
int t,n,m,a,b,c,x,y;
int dist[maxn],p[maxn],dp[maxn][maxn];
bool flag[maxn];
void dijkstra(int u){
for(int i=1;i<=n;i++){
dist[i]=dp[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(dist[j]<temp&&!flag[j]){
temp=dist[j];
t=j;
}
}
if(t==u)return ;
flag[t]=true;
for(int j=1;j<=n;j++){
if(dist[j]>dist[t]+dp[t][j]&&!flag[j]){
dist[j]=dist[t]+dp[t][j];
p[j]=t;
}
}
}
}
int main(){
while(~scanf("%d",&t)){
while(t--){
scanf("%d %d",&n,&m);
memset(dp,inf,sizeof(dp));
memset(flag,false,sizeof(flag));
for(int i=0;i<m;i++){
scanf("%d %d %d",&a,&b,&c);
dp[a][b]=min(dp[a][b],c);dp[b][a]=min(dp[b][a],c);//特判
}
scanf("%d %d",&x,&y);
dijkstra(x);
if(dist[y]==inf)cout<<"-1\n";
else cout<<dist[y]<<endl;
}
}
}