【最短路】【Heap-Dijkstra】【分层图】bzoj2662 [BeiJing wc2012]冻结

本文介绍了一种裸的分层图最短路算法实现,通过Dijkstra算法结合优先队列来求解带有限制层数的图中两点间的最短路径问题。该算法适用于解决具有特定层间边权重变化的图问题。

裸的分层图最短路。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<queue>
 4 #include<algorithm>
 5 using namespace std;
 6 #define N 51
 7 #define K 51
 8 #define M 2001
 9 struct Point{int u,d;Point(const int &a,const int &b){d=a;u=b;}Point(){}};
10 bool operator < (const Point &a,const Point &b){return a.d>b.d;}
11 priority_queue<Point>q;
12 int n,m,k,dis[N*K],ans=2147483647;
13 bool vis[N*K];
14 int first[M*K*2],next[M*K*2],v[M*K*2],w[M*K*2],en,x,y,z;
15 void AddEdge(const int &U,const int &V,const int &W)
16 {
17     v[++en]=V;
18     w[en]=W;
19     next[en]=first[U];
20     first[U]=en;
21 }
22 void dijkstra(const int &s)
23 {
24     memset(dis,0x7f,sizeof(dis));
25     dis[s]=0; q.push(Point(0,s));
26     while(!q.empty())
27       {
28         Point x=q.top(); q.pop();
29         if(!vis[x.u])
30           {
31             vis[x.u]=0;
32             for(int i=first[x.u];i;i=next[i])
33               if(dis[v[i]]>dis[x.u]+w[i])
34                 {
35                   dis[v[i]]=dis[x.u]+w[i];
36                   q.push(Point(dis[v[i]],v[i]));
37                 }
38           }
39       }
40     for(int i=0;i<=k;i++) ans=min(ans,dis[n+i*n]);
41     printf("%d\n",ans);
42 }
43 int main()
44 {
45     scanf("%d%d%d",&n,&m,&k);
46     for(int i=1;i<=m;i++)
47       {
48         scanf("%d%d%d",&x,&y,&z);
49         AddEdge(x,y,z); AddEdge(y,x,z);
50         for(int j=1;j<=k;j++)
51           {
52             AddEdge(x+j*n,y+j*n,z);
53             AddEdge(y+j*n,x+j*n,z);
54             AddEdge(x+(j-1)*n,y+j*n,z>>1);
55             AddEdge(y+(j-1)*n,x+j*n,z>>1);
56           }
57       }
58     dijkstra(1);
59     return 0;
60 }

转载于:https://www.cnblogs.com/autsky-jadek/p/4076569.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值