题意:

约翰一共有 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. Python查找-二分查找
  2. 剑指offer:滑动窗口最大值
  3. kibana显示JAVA,elasticsearch kibana简单查询讲解
  4. larvel mysql count,php – 模型中的Laravel计数函数,然后sortBy count()
  5. python subprocess 模块
  6. 统计学习:线性回归分析(1)
  7. Ubuntu无法正常输入英文单引号符号 + 误删除package导致系统设置异常(解决方案)...
  8. 算法-排序-冒泡排序
  9. 求一个数字是几位数(简便)
  10. 【CodeForces - 144B 】Meeting (暴力枚举,水题,计算几何)
  11. map函数作用c语言,C语言 · C++中map的用法详解
  12. 从前端到“钱”端,优秀程序员要掌握哪些核心技术?
  13. 蓝桥杯 ALGO-74 算法训练 连接字符串
  14. python导出exe文件不依赖环境_Python生成了不依赖dll的exe | 学步园
  15. CAS 配置NLB 负载均衡网络无法连接
  16. Coolite Toolkit学习笔记二:服务器端Alert,Confirm,Prompt
  17. 用latex画化学结构式
  18. 【产品】业务流程+任务流程+页面流程绘制指南
  19. win10 计算机网络密码,详细教你Win10怎么查看无线网络密码
  20. SpringBoot使用druid的密码加密

热门文章

  1. 听说你趁我不在家,欺负我老婆?
  2. 疯狂福利 | 美剧《天赋异禀》1-2季免费送!播放超12亿!刷了整整一晚上,太上头!...
  3. 想不到,那些让我半夜偷偷收藏的沙雕表情包,竟是出自AI之手
  4. 相亲有风险,且行且珍惜!| 今日最佳
  5. oracle虚拟用户是什么意思,lr脚本中oracle 2tier虚拟用户相关内容
  6. 简述原型模型的特点_3D打印硅胶复模手板的步骤和特点有哪些
  7. linux path减少,Linux的环境变量PATH中所带来的问题及解决方法
  8. java虚拟机和javaGC_Java虚拟机(三):GC算法和种类
  9. 陕西省计算机二级报名流程,计算机二级考试报名流程
  10. php 自定义菜单 openid,微信公众平台开发(99) 自定义菜单获取OpenID