[图论]分层图最短路——建边

前言

今天写了一道图论题,题解有一种就是使用分层图求最短路的算法

但是我这里只是想说一下分层图建立关系的问题,并不是写题解和算法过程

例题 HDU 3499 Flight

链接 http://acm.hdu.edu.cn/showproblem.php?pid=3499

想法

按照题意我们只有一次使用减半价格的机会,所以对于这道题层数的只有两层

假设 从 u 点到 v 点的权值为 w

可以推出

这里我是使用邻接表存点,代码如下

 1 const int N=100005;
 2 const int M=500005;
 3 int head[N<<2+1],to[M],nex[M],val[M],cnt=0;
 4 inline void add(int s,int ed,int w)
 5 {
 6     to[++cnt]=ed;//u-->v 原边 
 7     val[cnt]=w;
 8     nex[cnt]=head[s];
 9     head[s]=cnt;
10     
11     to[++cnt]=ed+n;//u-->v+n 连接到下层图 费用减少  
12     val[cnt]=w/2;
13     nex[cnt]=head[s];
14     head[s]=cnt;
15     
16     to[++cnt]=ed+n;// u+n-->v+n 下层图两点相连 
17     val[cnt]=w;
18     nex[cnt]=head[s+n];
19     head[s+n]=cnt;
20 }

注意

我们每建一层图,我们对应的点的位置需要向后移动n个,因此需要注意 数组范围

 

转载于:https://www.cnblogs.com/Snowindfly/p/11420900.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值