给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为正值。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。
输入格式
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示点x和点y之间存在一条有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
如果路径不存在,则输出-1。
数据范围
1≤n,m≤1051≤n,m≤105,图中涉及边长均不超过10000。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3算法:堆优化版的求最短路
#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=
100010;
int h[N],e[N],ne[N],w[N],idx,m,n,dis[N];
typedef pair<
int,
int>
PII;
priority_queue<PII,vector<PII>, greater<PII>>
heap;
void add(
int a,
int b,
int c){
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++
;
}
int dijkstra(){
memset(dis, 0x3f,
sizeof(dis));
dis[1]=
0;
heap.push({0,
1});
while(heap.size()){
auto t=
heap.top();
heap.pop();
int ver=t.second, distance=
t.first;
for(
int i=h[ver];~i;i=
ne[i]){
int j=
e[i];
if(dis[j]>distance+
w[i]){
dis[j]=distance+
w[i];
heap.push({dis[j],j});
}
}
}
if(dis[n]==
0x3f3f3f3f)
return -
1;
return dis[n];
}
int main(
void){
memset(h,-
1,
sizeof(h));
cin>>n>>
m;
for(
int i=
0,a,b,c;i<m;i++
){
cin>>a>>b>>
c;
add(a,b,c);
}
cout<<dijkstra()<<
endl;
return 0;
}
转载于:https://www.cnblogs.com/programyang/p/11186488.html