题意:

约翰一共有 N 个牧场.由 MM 条布满尘埃的小径连接。小径可以双向通行。每天早上约翰从牧场 1 出发到牧场 N 去给奶牛检查身体。

通过每条小径都需要消耗一定的时间。约翰打算升级其中 K 条小径,使之成为高速公路。在高速公路上的通行几乎是瞬间完成的,所以高速公路的通行时间为 0。

请帮助约翰决定对哪些小径进行升级,使他每天从 1 号牧场到第 N 号牧场所花的时间最短。

题解:

参考题解“”
一直知道分层图,但是没用过,突然遇到一道分层图的网络流题目,发现自己忘了分层图咋实现,赶紧拿来一道分层图模板题做做
简单说说什么是分层图:
其实就是将一个平面的图重新建图,有好几层
具体的说每层图之间各自连边与原图一样,但是相邻的两层图之间根据原来的关系进行连边
虽然是多层图,但是用一维的关系就可以
比如:
当有3个点,3层图时
1对应的就是 1+n 和 1+2 * n
2对应的就是 2+n 和 2+2 * n

当存在n个点,k层图时,
1对应的就是1+n * 0, 1+ n* 1…1+n * (k-1)
而且每一层的图都遵循只能从上面的图到下一层图,不能反过来
那建这么多层图的目的是什么呢?
你可以理解成是一种尝试,就比如本题,我们向下一层就代表改造一条道路
我们向下一层代表改造一条道路,我们不可能改造道路后再把它修回原来的样子


我们要建多少层?
有k次机会,不难想出,我们要建k+1层

代码:

#include<cstdio>
#include<queue>
#define read(x) scanf("%d",&x)//宏定义,个人习惯
#define INF 0x3f3f3f3f//伪极大值
using namespace std;
typedef pair<int,int> pii;//个人习惯
struct Node
{int head,dis;
}node[210100];//数组大小注意
struct Edge
{int to,len,next;
}edge[4200100];//数组大小注意
int n,m,k,u,v,w,cnt,ans=INF<<1;
void addEdge(int u,int v,int w)
{edge[++cnt]={v,w,node[u].head};node[u].head=cnt;
}
//链式前向星存图
void Dijkstra()
{for(int i=1;i<=n*(k+1);i++){node[i].dis=INF;}//初始化时,要注意我们的点数已经不是n了,而是n*(k+1)node[1].dis=0;priority_queue<pii,vector<pii>,greater<pii> >q;//小根堆q.push({0,1});while(q.size()){pii tmp=q.top();q.pop();int d=tmp.first,u=tmp.second;if(d!=node[u].dis)continue;for(int e=node[u].head;e;e=edge[e].next){int v=edge[e].to;if(node[v].dis>edge[e].len+d){node[v].dis=edge[e].len+d;q.push({node[v].dis,v});}}}
}
//最短路板子不解释
int main()
{read(n),read(m),read(k);for(int i=1;i<=m;i++){read(u),read(v),read(w);for(int j=0;j<=k;j++){/*当j为0时,我们建立的是原图的边当j不为0时,我们建立的是分身的边*/addEdge(u+j*n,v+j*n,w);addEdge(v+j*n,u+j*n,w);//上面两行是每层图之间,自身的点的连线,边权不变if(j==k)break;/*为什么当j==k时,要退出循环呢?因为如果j==k时,还建下面的边,那么就超出范围了可以自行感性理解一下*/addEdge(u+j*n,v+(j+1)*n,0);addEdge(v+j*n,u+(j+1)*n,0);//这两行建立的是层与层之间的边,边权为0}}Dijkstra();//跑最短路for(int i=0;i<=k;i++){ans=min(ans,node[n+i*n].dis);//统计每一层到n距离的最小值}printf("%d\n",ans);//输出答案return 0;
}

[USACO09FEB]Revamping Trails G相关推荐

  1. 【分层图最短路】P2939 [USACO09FEB]Revamping Trails G

    将整个dijkstra的操作加上一维k就行了 注意dis赋极大值的时候要从0-k都赋上! 代码 #include<bits/stdc++.h> using namespace std; t ...

  2. 洛谷 P2939 [USACO09FEB]改造路Revamping Trails

    洛谷 P2939 [USACO09FEB]改造路Revamping Trails Description 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到 ...

  3. [JLOI 2011]飞行路线[USACO 09FEB]Revamping Trails

    Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...

  4. P1607 [USACO09FEB]Fair Shuttle G

    P1607 [USACO09FEB]Fair Shuttle G 题意 现在又n头牛,分成了k组,每一组有三个值,s.e.m,分别表示,这一组牛从s到e,并且这一组里面有m头牛,现在有一辆车,一次只能 ...

  5. [USACO09FEB]改造路Revamping Trails 分层最短路 Dijkstra BZOJ 1579

    题意翻译 约翰一共有N)个牧场.由M条布满尘埃的小径连接.小径可 以双向通行.每天早上约翰从牧场1出发到牧场N去给奶牛检查身体. 通过每条小径都需要消耗一定的时间.约翰打算升级其中K条小径,使之成为高 ...

  6. 洛谷P2939 [USACO09FEB]改造路Revamping Trails(最短路)

    题目描述 Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= ...

  7. P4568 [JLOI2011]飞行路线 P2939 [USACO09FEB]改造路Revamping Trails

    分层图最短路系列题目 分层图最短路的题目有一个非常容易看得出的把戏:让k条边免费. 对于能让\(k\)条边免费的数据,我们开\(k+1\)层图.每一层图内部正常连点,不同的是前一层的图的起点连一条权值 ...

  8. [Usaco2009 Feb]Revamping Trails 道路升级

    题目描述 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 < ...

  9. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级【分层图+spfa】

    至死不用dijskstra系列2333,洛谷上T了一个点,开了O2才过 基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为0,表示免了这条边 ...

最新文章

  1. StoneAge Dict 技术方案的可行性[1]
  2. linux tar的使用方法
  3. 存储架构|Bitcask 引擎的设计,秒!
  4. 网络推广外包——网络推广外包专员如何做好网站首页设计
  5. Python + logging 输出到屏幕,将log日志写入文件(亲测)
  6. Java 将字符串转换为字符数组 toCharArray()
  7. python朋友圈评论_利用Python实现朋友圈中的九宫格图片效果
  8. Sharepoint学习笔记—DebugTroubleShooting--不同调试对象的Attach方式
  9. ORA-01555 原因与解决
  10. linux怎样写java代码,linux 怎么写java
  11. android如何做工作流,JIRA 知多少:聊一聊 Android Studio 、工作流相关设置
  12. 操作日志和系统日志分类记录
  13. Discuz!客户端api开发(一)
  14. PHP面试技巧 之 职场暗语知多少?!
  15. Tecplot 10 将输入的多个plt文件做成动画 :
  16. 【2023】DevOps、SRE、运维开发面试宝典之Redis相关面试题
  17. php教程--案例4(判断闰年)
  18. SLAM14讲学习笔记(十五)卡尔曼滤波器的直观理解
  19. MathNet.Numerics主要类功能简述
  20. UVA 1626括号序列DP

热门文章

  1. 22岁少年破解史上最严重网络攻击,拯救全球互联网,三个月后却被FBI逮捕
  2. 全国胸最小的省是哪个,你知道吗?| 今日最佳
  3. 从一个骗局谈生活中的基础算法
  4. 我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!
  5. 逻辑回归算法背后的数学
  6. a*算法的时间复杂度_数据结构(1)——算法和时间复杂度
  7. 计算机数控是什么专业,数控是什么专业
  8. c语言修改windows系统时间,c语言实现系统时间校正工具代码分享
  9. oracle日志文件大小规则,在线重做Oracle日志文件大小
  10. java 声明变量构成_Java—变量