分层图最短路问题

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 
View Code

 

以上是关于分层图最短路问题的主要内容,如果未能解决你的问题,请参考以下文章

P4568 飞行路线 分层图最短路

分层图最短路 乱搞分享

P4568 [JLOI2011]飞行路线 && 分层图最短路板子

BZOJ 2763 分层图最短路

最短路 || 分层图最短路

分层图最短路