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。

数据范围

1n,m10^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 }
hhの辣鸡代码

 

 

以上是关于dij-堆优化的主要内容,如果未能解决你的问题,请参考以下文章

模板堆优化 + dij +pair 存储

单源最短路径(dij+堆优化)

dij-堆优化

洛谷P1462二分+堆优化dij

D. Returning Home(建边,dij堆优化)

迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少