dij-堆优化
Posted calculus9
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dij-堆优化相关的知识,希望对你有一定的参考价值。
题目描述
给定一个n个点m条边的有向图,图中可能存在重边和自环,所有边权均为非负值。
请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。
输入格式
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
输出格式
输出一个整数,表示1号点到n号点的最短距离。
如果路径不存在,则输出-1。
数据范围
1≤n,m≤10^51≤n,m≤10^5,
图中涉及边长均不小于0,且不超过10000。
输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3
1 #pragma GCC diagnostic error "-std=c++11" 2 #include<bits/stdc++.h> 3 using namespace std; 4 5 const int N=100010; 6 const int inf=0x3f3f3f3f; 7 8 typedef pair<int ,int> pii; 9 int e[N],h[N],ne[N],w[N],idx;//邻接表 10 int dis[N],n,m; 11 bool vis[N]; 12 13 void add(int a,int b,int c) 14 { 15 e[idx]=b; 16 w[idx]=c; 17 ne[idx]=h[a]; 18 h[a]=idx++; 19 } 20 int dij() 21 { 22 memset(dis,inf,sizeof dis); 23 dis[1]=0; 24 priority_queue<pii,vector<pii>,greater<pii>> heap; 25 heap.push({0,1}); 26 while (heap.size()) 27 { 28 auto t=heap.top(); 29 heap.pop(); 30 int distance=t.first,ver=t.second;//first存距离 second存编号 31 if(vis[ver]) continue; 32 for(int i=h[ver];i!=-1;i=ne[i]) 33 { 34 int j=e[i]; 35 if(dis[j]>distance+w[i]) 36 { 37 dis[j]=distance+w[i]; 38 heap.push({dis[j],j});//※ 39 } 40 } 41 } 42 if(dis[n]==inf) return -1; 43 return dis[n]; 44 } 45 int main() 46 { 47 cin>>n>>m; 48 memset(h,-1,sizeof h);//※ 49 for(int i=1;i<=m;i++) 50 { 51 int u,v,w;cin>>u>>v>>w; 52 add(u,v,w); 53 } 54 cout<<dij()<<endl; 55 }
以上是关于dij-堆优化的主要内容,如果未能解决你的问题,请参考以下文章