ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

分层图(Dijkstra)

2021-12-04 21:33:51  阅读:112  来源: 互联网

标签:cnt pq cur int 分层 Dijkstra 80 head


 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 typedef long long ll;
 5 
 6 const int MAXN=100100;
 7 const int MAXM=500100;
 8 const int INF=0x3f3f3f3f;
 9 
10 struct Edge
11 {
12     int to,next;
13     int w;
14 }e[MAXM*80];
15 int head[MAXM*80];
16 ll t[MAXN*80];
17 bool vis[MAXN*80];
18 
19 int n=MAXN,m=MAXM,k;
20 
21 int cnt=0;
22 void addEdge(int x,int y,int z)
23 {
24     cnt++;
25     e[cnt].to=y;
26     e[cnt].next=head[x];
27     e[cnt].w=z;
28     head[x]=cnt;
29     return;
30 }
31 
32 void Dijkstra()
33 {
34     for (int i=1;i<=(k+1)*n;i++)
35     {
36         t[i]=INF;
37         vis[i]=false;
38     }
39     t[1]=0;
40 
41     priority_queue< pair<int,int> >pq;
42     pq.push(make_pair(0,1));
43 
44     while (!pq.empty())
45     {
46         int cur=pq.top().second;
47         pq.pop();
48 
49         if (vis[cur])   continue;
50         vis[cur]=true;
51 
52         for (int i=head[cur];i!=0;i=e[i].next)
53         {
54             if (t[e[i].to]>t[cur]+e[i].w)
55             {
56                 t[e[i].to]=t[cur]+e[i].w;
57                 pq.push(make_pair(-t[e[i].to],e[i].to));
58             }
59         }
60     }
61     return;
62 }
63 
64 int main()
65 {
66     cin>>n>>m>>k;
67 
68     int u,v,w;
69     for (int i=1;i<=m;i++)
70     {
71         cin>>u>>v>>w;
72         for (int i=0;i<=k;i++)
73         {
74             addEdge(u+i*n,v+i*n,w);
75             addEdge(v+i*n,u+i*n,w);
76         }
77         for (int i=0;i<k;i++)
78         {
79             addEdge(u+i*n,v+(i+1)*n,0);
80             addEdge(v+i*n,u+(i+1)*n,0);
81         }
82     }
83 
84     Dijkstra();
85 
86     ll ans=INF;
87     for (int i=1;i<=(k+1);i++)
88     {
89         ans=min(ans,t[i*n]);
90     }
91     cout<<ans<<endl;
92 
93     return 0;
94 }

 

标签:cnt,pq,cur,int,分层,Dijkstra,80,head
来源: https://www.cnblogs.com/hell0er/p/15643291.html

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

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

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

ICode9版权所有