分层图最短路问题
Posted g-xf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分层图最短路问题相关的知识,希望对你有一定的参考价值。
分层图最短路是指在可以进行分层图的图上解决最短路问题。一般模型是:在图上,有k次机会可以直接通过一条边,问起点与终点之间的最短路径。——引自百度百科
模板题目:https://ac.nowcoder.com/acm/contest/884/J
https://www.luogu.org/problem/P4568
处理方法
网传所谓建图,DP两种方法,无非是写法不同,其本质都是建立多层图(个人见解)。
建图
建图时把原图复制k份,每份之间的边权应该置为0(意为使用一次免费机会)。从1层的s跑一遍dijkstra到k层的t。
void pre(int x,int y,int w) for(int i=0;i<=k;i++) add(x+n*i,y+n*i,w), add(y+n*i,x+n*i,w); for(int i=0;i<k;i++) add(x+n*i,y+n*i+n,0), add(y+n*i,x+n*i+n,0);
当然也完全可以用一个二维数组来存,方便好写,代码如下:
1 #include<iostream> 2 #include<cstring> 3 #include<queue> 4 #define ll long long 5 using namespace std; 6 typedef pair<int,int> pir; 7 priority_queue<pir,vector<pir>,greater<pir> > q; 8 struct node 9 10 int nex,y,w; 11 e[2002]; 12 int m,n,s,t,k; 13 int head[1001]; 14 int d[1001][1001]; 15 bool v[1001][1001]; 16 void add(int x,int y,int z) 17 18 e[++m].y=y; 19 e[m].w=z; 20 e[m].nex=head[x]; 21 head[x]=m; 22 23 void DJ() 24 25 memset(d,0x3f,sizeof(d)); 26 int x,j,num; 27 d[s][0]=0; 28 q.push(make_pair(0,s)); 29 while(q.size()) 30 31 x=q.top().second;q.pop(); 32 num=x/n;x%=n; 33 if(v[x][num]) continue; 34 v[x][num]=1; 35 for(int i=head[x];i;i=e[i].nex) 36 37 j=e[i].y; 38 if(d[x][num]+e[i].w<d[j][num]) 39 40 d[j][num]=d[x][num]+e[i].w; 41 q.push(make_pair(d[j][num],j+n*num)); 42 43 if(num==k) continue; 44 if(d[j][num+1]>d[x][num]) 45 46 d[j][num+1]=d[x][num]; 47 q.push(make_pair(d[j][num+1],j+(num+1)*n)); 48 49 50 51 52 int main() 53 54 int tmp,x,y,z; 55 cin>>n>>tmp>>s>>t>>k; 56 while(tmp--) 57 58 cin>>x>>y>>z; 59 add(x,y,z);add(y,x,z); 60 61 DJ(); 62 return 0; 63
以上是关于分层图最短路问题的主要内容,如果未能解决你的问题,请参考以下文章