城市路(Dijkstra)(c++题解)
·
题目描述
罗老师被邀请参加一个舞会,是在城市n,而罗老师当前所处的城市为1,附近还有很多城市2~n-1,有些城市之间没有直接相连的路,有些城市之间有直接相连的路,这些路都是双向的,当然也可能有多条。
现在给出直接相邻城市的路长度,罗老师想知道从城市1到城市n,最短多少距离。
输入格式
输入n, m,表示n个城市和m条路;
接下来m行,每行a b c, 表示城市a与城市b有长度为c的路。
输出格式
输出1到n的最短路。如果1到达不了n,就输出-1。
样例
样例输入
复制5 5
1 2 20
2 3 30
3 4 20
4 5 20
1 5 100
样例输出
复制90
数据范围与提示
【数据规模和约定】
1≤n≤2000
1≤m≤10000
0≤c≤10000
_____________________________________________________________________________
写作不易,点个赞呗!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
_____________________________________________________________________________
#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
struct node{
int x;
int y;
int w;
}a[1000005];
int dist[1000005];
int n,m;
bool flag;
int f(int q,int p){
memset(dist,0x3f3f3f3f,sizeof(dist));
dist[q]=0;
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m*2;j++){
if(dist[a[j].y]>dist[a[j].x]+a[j].w){
dist[a[j].y]=dist[a[j].x]+a[j].w;
}
}
}
for(int j=1;j<=m*2;j++){
if(dist[a[j].y]>dist[a[j].x]+a[j].w){
flag=true;
}
}
return dist[p];
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>a[i].x>>a[i].y>>a[i].w;
a[i+m].x=a[i].y,a[i+m].y=a[i].x,a[i+m].w=a[i].w;
}
int t=f(1,n);
if(t==0x3f3f3f3f)cout<<"-1";
else cout<<t<<endl;
return 0;
}
更多推荐


所有评论(0)