ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

dijkstra算法:链式前向星+堆优化

2020-04-13 18:03:02  阅读:278  来源: 互联网

标签:cnt dj int dijkstra edge 链式 now 前向星 dis


最近发现struct板子真的好用。

 1 #include<bits/stdc++.h>
 2 #define ll long long 
 3 #define scan(i) scanf("%d",&i)
 4 #define scand(i) scanf("%lf",&i)
 5 #define scanl(i) scanf("%lld",&i)
 6 #define f(i,a,b) for(int i=a;i<=b;i++) 
 7 #define pb(i) push_back(i)
 8 #define ppb pop_back()
 9 #define pf printf
10 #define input freopen("in.txt","r",stdin)
11 #define output freopen("out.txt","w",stdout)
12 #define io ios::sync_with_stdio(0)
13 #define dbg(args...) cout<<#args<<" : "<<args<<endl
14 #define inf 0x3f3f3f3f
15 #define pii pair<int, int>
16 const int mod = 1e9+7;
17 const int maxn = 2e5+7;
18 using namespace std;
19 struct node {int to,w,next;} edge[maxn];
20 int n,m;
21 struct Dijkstra{
22     int dis[maxn], vis[maxn];
23     int head[maxn],cnt;
24     int s,t;
25     
26     void init(){
27         memset(head,-1,sizeof(head));
28         memset(dis,0x3f,sizeof(dis));
29         memset(vis,0,sizeof(vis));
30         cnt = 0;
31     }
32  
33     void add(int u,int v,int w){
34         edge[cnt].to = v;
35         edge[cnt].w = w;
36         edge[cnt].next = head[u];
37         head[u] = cnt++;
38     }
39  
40     void dijkstra(){
41         priority_queue<pii,vector<pii>,greater<pii> > q;//从小到大
42         dis[s] = 0; q.push({dis[s],s});
43         while(!q.empty()){
44             int now = q.top().second;
45             q.pop();
46             if(vis[now]) continue;
47             vis[now] = 1;
48             for(int i = head[now]; i != -1; i = edge[i].next){
49                 int v = edge[i].to;
50                 if(dis[v] > dis[now] + edge[i].w){
51                     dis[v] = dis[now] + edge[i].w;
52                     q.push({dis[v],v});
53                 }
54             }
55         }
56     }
57 }dj;
58  
59 int main(){
60     while(~scanf("%d%d",&n,&m) && n+m){
61         dj.init();
62         for(int i = 0; i < m; i++){
63             int u, v, w;
64             scanf("%d%d%d",&u, &v, &w);
65             dj.add(u, v, w);
66             dj.add(v, u, w);
67         }
68         dj.s=1,dj.t=n;//s起点,t终点
69         dj.dijkstra();
70         printf("%d\n",dj.dis[dj.t]);
71     }
72 }

 

标签:cnt,dj,int,dijkstra,edge,链式,now,前向星,dis
来源: https://www.cnblogs.com/St-Lovaer/p/12692885.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有