码迷,mamicode.com
首页 > 其他好文 > 详细

分层图最短路问题

时间:2019-07-28 17:18:22      阅读:105      评论:0      收藏:0      [点我收藏+]

标签:isp   cst   col   air   second   一个   struct   display   style   

分层图最短路是指在可以进行分层图的图上解决最短路问题。
 
一般模型是:
 
在图上,有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

 

分层图最短路问题

标签:isp   cst   col   air   second   一个   struct   display   style   

原文地址:https://www.cnblogs.com/g-xf/p/11258388.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!