Telephone Lines

本文深入探讨了Dijkstra算法的实现细节,包括其在图论中的应用,特别是在寻找最短路径问题上的高效解决方案。通过具体代码示例,展示了如何使用优先队列优化算法性能,以及如何处理大规模数据集中的边和顶点。
摘要由CSDN通过智能技术生成

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m,k;
 4 const int maxn=1e6+10;
 5 const int maxm=9e6+10;
 6 const int inf=0x3f3f3f3f;
 7 struct Dijkstra
 8 {
 9     struct Edge
10     {
11         int next,  to ,w;
12     } e[maxm];
13     int head[maxn],v[maxn],d[maxn],tol;
14     void add(int u, int v, int w)
15     {
16         tol++;
17         e[tol].to = v;
18         e[tol].next = head[u];
19         e[tol].w = w;
20         head[u] = tol;
21     }
22     priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >q1;
23     int dijkstra(int s,int t)
24     {
25         memset(d,inf,sizeof(d));
26         memset(v,0,sizeof(v));
27         d[s] = 0;
28         q1.push(make_pair(0, s));
29         while (!q1.empty())
30         {
31             int x = q1.top().second;
32             q1.pop();
33             if (!v[x])
34             {
35                 v[x] = 1;
36                 for (register int i = head[x]; i; i = e[i].next)
37                 {
38                     int to=e[i].to,k=max(e[i].w,d[x]);
39                     if (d[to]>k){
40                         d[to]=k;
41                         q1.push(make_pair(d[to], to));
42                     }
43                 }
44             }
45         }
46         return d[t];
47     }
48  
49     void init()
50     {
51         memset(head, 0, sizeof(head));
52         tol = 0;
53     }
54 } H;
55  
56  
57 int main(){
58     scanf("%d%d%d",&n,&m,&k);
59     H.init();
60     for (int i=1;i<=m;i++){
61         int u,v,w;
62         scanf("%d%d%d",&u,&v,&w);
63         H.add(u,v,w);
64         H.add(v,u,w);
65         for (int j=1;j<=k;j++) {
66             H.add(u+n*(j-1), v + j * n, 0);
67             H.add(v+n*(j-1),  u+ j * n, 0);
68             H.add(u+j*n,v+j*n,w);
69             H.add(v+j*n,u+j*n,w);
70         }
71         for (int i=1;i<=k;i++){
72             H.add(i*n,(i+1)*n,0);
73         }
74     }
75     int ans=H.dijkstra(1,n*(k+1));
76     if (ans==inf) printf("-1\n");else printf("%d\n",ans);
77 }
View Code

 

 

转载于:https://www.cnblogs.com/Accpted/p/11230782.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值