题目描述

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

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

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

请帮助约翰决定对哪些小径进行升级,使他每天早上到牧场W花的时间最少.输出这个最少 的时间.

输入输出格式

输入格式:

* 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+1张原图,图与图之间的边权为0,边为原图中的边

这样跑一个二维dijstra(真难写)就好了

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define Pair pair<int,int>
#define F first
#define S second
const int MAXN=1e6+10;
using namespace std;
inline int read()
{char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f;
}
int N,M,K;
int dis[MAXN][21],vis[MAXN][21];
struct node
{int u,v,w,nxt;
}edge[MAXN];
int head[MAXN],num=1;
inline void AddEdge(int x,int y,int z)
{edge[num].u=x;edge[num].v=y;edge[num].w=z;edge[num].nxt=head[x];head[x]=num++;
}
void Dijstra()
{memset(dis,0xf,sizeof(dis));dis[1][0]=0;//第i个点,第j层priority_queue< pair<int,Pair > > q;q.push(make_pair(0,make_pair(1,0)));//第一个表示点,第二个表示层 while(q.size()!=0){while(vis[q.top().S.F][q.top().S.S]&&q.size()>0) q.pop();Pair p=q.top().second;vis[p.F][p.S]=1;for(int i=head[p.F];i!=-1;i=edge[i].nxt){int will=edge[i].v;if(vis[will][p.S]==0&&dis[will][p.S]>dis[p.F][p.S]+edge[i].w) dis[will][p.S]=dis[p.F][p.S]+edge[i].w,q.push(make_pair(-dis[will][p.S],make_pair(will,p.S)));if(p.S+1<=K&&vis[will][p.S+1]==0&&dis[will][p.S+1]>dis[p.F][p.S])dis[will][p.S+1]=dis[p.F][p.S],q.push(make_pair(-dis[will][p.S+1],make_pair(will,p.S+1)));}}printf("%d",dis[N][K]);
}
int main()
{memset(head,-1,sizeof(head));N=read();M=read();K=read();for(int i=1;i<=M;i++){int x=read(),y=read(),z=read();AddEdge(x,y,z);AddEdge(y,x,z);}Dijstra();return 0;
}

转载于:https://www.cnblogs.com/zwfymqz/p/8473810.html

洛谷P2939 [USACO09FEB]改造路Revamping Trails(最短路)相关推荐

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

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

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

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

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

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

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

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

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

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

  6. 洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA

    洛谷P1462 通往奥格瑞玛的道路 二分答案+最短路SPFA 二分交费最多的一次的钱数 然后只将符合要求的边加入图中 如果到终点的最短路大于等于血量 或者直接起点不能到达终点 那么说明不符合要求 需要 ...

  7. [Dijstra] 洛谷 P2939 改造路

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

  8. 洛谷P1613 跑路

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

  9. 图论--最长路--洛谷P1807 最长路_NOI导刊2010提高(07)

    题目描述 设G为有n个顶点的有向无环图,G中各顶点的编号为1到n,且当为G中的一条边时有i < j.设w(i,j)为边的长度,请设计算法,计算图G中<1,n>间的最长路径. 输入格式 ...

最新文章

  1. python3入门书籍-零基础自学python3 好用的入门书籍推荐
  2. 7-20上午刷题未知点集合
  3. SAP S/4HANA Material 物料主数据的简单介绍
  4. Java中的list、set、map区别
  5. Mysql库及表的基本概念、增删查改操作以及表的约束、多表联查
  6. 如何选举根端口,指定端口,阻塞端口
  7. java socket5源码_Java利用TCP协议实现客户端与服务器通信【附通信源码】
  8. htons、inet_addr、
  9. 8. 大型网站架构演化
  10. java比较时间大小
  11. 九月手机无新事:头部品牌没创新,二三线品牌静悄悄
  12. java水电费收费系统_java水电费管理系统
  13. 球面投影全景图快速拼接
  14. Qt Creator 8.0.1 (Community)创建项目出现No valid kits found怎么办?
  15. 【渝粤题库】广东开放大学 网络风险评估 形成性考核
  16. 飞机打扭来扭去的靶子
  17. gensim基本使用+文本相似度分析
  18. 硬盘格式化数据恢复(图文教程)
  19. 通信端口感叹号_PCI简易通讯控制器有黄色感叹号怎么办?
  20. python爬取英雄联盟所有皮肤价格表_利用Python协程来爬取LOL所有英雄的皮肤高清图片...

热门文章

  1. html5两个静态页面传值,如何使用HTML5Viewer 进行参数传递
  2. python 0xa什么意思_python使用xpath中遇到:Element a at 0x39a9a80到底是什么?
  3. python导入requests库_windows环境中python导入requests
  4. 查看服务器大文件,linux 查看服务器大文件
  5. html 分页 惰性加载,懒加载实现的分页网站footer自适应
  6. 蓝牙 查询码 android,android bluetooth UUID蓝牙查询表
  7. githua 账号合并_如何合并他人的分支 github
  8. dw cc链接mysql_Adobe Dreamweaver CC MySQL连接 报404错误的解决方法_MySQL
  9. TMS320C55x的指令系统
  10. Windows10下VB6.0开发——常见控件使用整理