题意翻译

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

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

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

题目描述

Farmer John dutifully checks on the cows every day. He traverses some of the M (1 <= M <= 50,000) trails conveniently numbered 1..M from pasture 1 all the way out to pasture N (a journey which is always possible for trail maps given in the test data). The N (1 <= N <= 10,000) pastures conveniently numbered 1..N on Farmer John's farm are currently connected by bidirectional dirt trails. Each trail i connects pastures P1_i and P2_i (1 <= P1_i <= N; 1 <= P2_i <= N) and requires T_i (1 <= T_i <= 1,000,000) units of time to traverse.

He wants to revamp some of the trails on his farm to save time on his long journey. Specifically, he will choose K (1 <= K <= 20) trails to turn into highways, which will effectively reduce the trail's traversal time to 0. Help FJ decide which trails to revamp to minimize the resulting time of getting from pasture 1 to N.

TIME LIMIT: 2 seconds

输入输出格式

输入格式:

* Line 1: Three space-separated integers: N, M, and K

* Lines 2..M+1: Line i+1 describes trail i with three space-separated integers: P1_i, P2_i, and T_i

输出格式:

* Line 1: The length of the shortest path after revamping no more than K edges

输入输出样例

输入样例#1:

4 4 1
1 2 10
2 4 10
1 3 1
3 4 100

输出样例#1:

1

说明

K is 1; revamp trail 3->4 to take time 0 instead of 100. The new shortest path is 1->3->4, total traversal time now 1.

题解

  • 这题是分层图裸题

  • 搞一个k层的图,每两层间相同的点所连的边的权值为0

  • 然后就可以在这个立体的图中跑最短路

  • 然后我们发现这样或许有些浪费空间,所以建0边的过程可以省略,然后在跑dijkstra过程中可以让它到达下一层的当前这个点

代码

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <queue>
 4 #define N 10010
 5 using namespace std;
 6 struct edge
 7 {
 8     int id,d,p;
 9     friend bool operator <(edge x,edge y) { return x.d>y.d; }
10 };
11 priority_queue<edge> Q;
12 struct Edge {int to,z,from;} e[N*10];
13 bool bz[25][N];
14 int n,m,k,cnt,head[N],dis[25][N];
15 void insert(int x,int y,int z) { e[++cnt].to=y,e[cnt].z=z,e[cnt].from=head[x],head[x]=cnt; }
16 int dijkstra()
17 {
18     memset(bz,true,sizeof(bz)),memset(dis,63,sizeof(dis)),dis[0][1]=0,Q.push((edge){1,0,0});
19     while (!Q.empty())
20     {
21         int x=Q.top().id,p=Q.top().p,d=Q.top().d; Q.pop();
22         if (!bz[p][x]) continue;
23         bz[p][x]=false,dis[p][x]=d;
24         for (int i=head[x];i;i=e[i].from)
25         {
26             if (dis[p][x]+e[i].z<dis[p][e[i].to]) dis[p][e[i].to]=dis[p][x]+e[i].z,Q.push((edge){e[i].to,dis[p][e[i].to],p});
27             if (p+1<=k&&dis[p][x]<dis[p+1][e[i].to]) dis[p+1][e[i].to]=dis[p][x],Q.push((edge){e[i].to,dis[p+1][e[i].to],p+1});
28         }
29     }
30     return dis[k][n];
31 }
32 int main()
33 {
34     scanf ("%d%d%d",&n,&m,&k);
35     for (int i=1,x,y,z;i<=m;i++) scanf("%d%d%d",&x,&y,&z),insert(x,y,z),insert(y,x,z);
36     printf("%d",dijkstra());
37 }

转载于:https://www.cnblogs.com/Comfortable/p/10447079.html

[Dijstra] 洛谷 P2939 改造路相关推荐

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

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

  2. 洛谷P1589 泥泞路

    洛谷P1589 泥泞路 题目描述 暴雨过后,FJ的农场到镇上的公路上有一些泥泞路,他有若干块长度为L的木板可以铺在这些泥泞路上,问他至少需要多少块木板,才能把所有的泥泞路覆盖住. 输入输出格式 输入格 ...

  3. 最短路分层图专题 洛谷P2939,4822,4568

    2020.6.3 今天主要练习了下分层图.看洛谷题解每次都能有新收获.今天本来想练dp,后来感觉可能会太自闭了,不如先来一发最短路,毕竟看家本领不能忘.然后点进了北京某年wc的一道题,让求1-n的最短 ...

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

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

  5. 洛谷 P1589 泥泞路 2019青岛市竞赛(贪心)

    题目链接 https://www.luogu.org/problemnew/show/P1589 解题思路 用结构体存下每一段泥泞路的左端点和右端点,然后用sort根据左端点排序,采用贪心的思想,从左 ...

  6. 洛谷——P1613 跑路

    P1613 跑路 题目大意: 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B ...

  7. 洛谷 P3359 改造异或树

    传送门 30分做法:(边权为0) 我一开始就在想30分做法,然后就想到了: 首先老套路,正着删边就是倒着加边. 并查集维护连通块大小,每次加边后将两个端点的size值乘起来累加答案. 20分做法: 当 ...

  8. 洛谷P1807 最长路_NOI导刊2010提高(07) 求有向无环图的 最长路 图论

    洛谷P1807 最长路_NOI导刊2010提高(07) 图论 求有向无环图的 最长路 首先阐明一点 最长路dijkstra 是不能做 (当然我是不会做的,不过我貌似看到过网上的dalao有用dijst ...

  9. 图论——最长路(洛谷 P1807)

    题目选自洛谷P1807 对于一个有向无环图,可以采取广搜将结点依次搜索,记录当前结点的最长路并在循环过程中不断更新. 题目描述 设 G 为有 n 个顶点的带权有向无环图,G 中各顶点的编号为 1 到  ...

最新文章

  1. javascript完美判断类型
  2. python声音信号调制_用python产生正弦波和PWM信号产生脉冲幅度调制
  3. About 4B/5B
  4. 系统安装教程:Windows7硬盘安装方法详细图文教程及使用工具下载
  5. python中的ord,chr函数
  6. httpsecurity 类方法介绍_java知识学习25-内部类 - 那种意境
  7. 使用BeautifulSoup爬取“0daydown”网站的信息(1)
  8. ARM指令集(数据处理指令)
  9. PostMan——安装使用教程(图文详解)
  10. 代码执行sql出错:SQL syntax error, expected token is ‘RIGHT_PAREN‘, actual token is ‘IDENTIFIER‘
  11. python 检测键盘按键,随时停止程序
  12. 什么是前提、行为及后果?
  13. FastDfs与ElasticSearch和Mysql完成海量数据存储搜索功能
  14. 简介表格让你牢牢记住spring的7种事务传播机制
  15. 计算机网络(一)---分组交换及网络体系结构
  16. Charles4.6.2版本手机抓包设置,抓包失败的解决方法详解
  17. iNFTnews | 看见元宇宙的两面,何谓全真互联网和价值互联网?
  18. Python个人网盘源码、云盘系统源程序,基于Django+Mysql
  19. WPF中Popup控件的使用
  20. omni_usdt钱包文件keypoolsize是否持续为100个地址测试

热门文章

  1. 内存数据库服务运营之路
  2. Android界面开发问题总结
  3. gVim 取消自动备份(Windows/Linux)
  4. [转]arm汇编相关链接
  5. MyBatis源码流程分析
  6. 学生课程表管理系统——stage 1
  7. 关于vivo 8.0和miui新系统android studio调试出现“包解析错误”的bug的解决办法
  8. STM32-内存管理
  9. 2016.01.19 UITextField
  10. CTreeCtrl 控件实现多选并取得选中项