题意翻译

约翰一共有\(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\)是有\(k\)次可以不花费任何代价去走一条路,那么我们把图分为\(n\)层,每条边连向映射点与原来边的起来的距离为\(0\),然后跑\(dijkstra\),就做完了。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cctype>
#define maxn 5000001
using namespace std;
int n,m,k,head[maxn],num,dis[maxn],s,t;
inline int qread() {
char c=getchar();int num=0,f=1;
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num*10+c-'0';return num*f;
}
struct Edge {
int v,w,nxt;
}e[maxn];
struct node {
int x,y;
bool operator < (const node &a) const {return y>a.y;}
};
inline void ct(int u, int v, int w) {
e[++num].v=v;
e[num].w=w;
e[num].nxt=head[u];
head[u]=num;
}
priority_queue<node>q;
inline void dijkstra() {
memset(dis,0x3f,sizeof(dis));
dis[1+n*k]=0;q.push((node){1+n*k,0});
while(!q.empty()) {
int u=q.top().x,d=q.top().y;
q.pop();
if(d!=dis[u]) continue;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w) {
dis[v]=dis[u]+e[i].w;
q.push((node){v,dis[v]});
}
}
}
}
int main() {
n=qread(),m=qread(),k=qread();
for(int i=1,u,v,w;i<=m;++i) {
u=qread(),v=qread(),w=qread();
for(int j=0;j<=k;++j) {
ct(u+j*n,v+j*n,w);
ct(v+j*n,u+j*n,w);
if(j) {
ct(u+j*n,v+(j-1)*n,0);
ct(v+j*n,u+(j-1)*n,0);
}
}
}
dijkstra();
int zrj=0x7fffffff;
for(int i=0;i<=k;++i) zrj=min(zrj,dis[n+i*n]);
printf("%d\n",zrj);
return 0;
}

最新文章

  1. OC编程之道-创建对象之原型模式
  2. jQuery和ExtJS的timeOut超时问题和event事件处理问题
  3. 关于tomcat会在url末尾自动追加斜杠(/)
  4. C#资源文件和C#枚举如何结合使用?
  5. hdu 4828 Grids 卡特兰数+逆元
  6. 关于checkbox的attr无效的问题
  7. Boost简介
  8. A Tour of Go Function values
  9. 如何用Visual Studio 2008 写汇编程序?
  10. SQL Server里书签查找的性能伤害
  11. Ubuntu配置完全教程
  12. mysql SQL语法总结
  13. B. Pyramid of Glasses
  14. LJN数理化生信奥队自传
  15. [mvc] 简单的forms认证
  16. javascript中的立即执行函数(function(){…})()
  17. IT桔子-抓取数据
  18. Python2.7-heapq
  19. hadoop - hdfs 基础操作
  20. iOS多线程编程之GCD介绍(转载)

热门文章

  1. 在VS2015中的SDL2.0开发环境搭建
  2. 用vector代替实现二维数组
  3. Codeforces - 828C String Reconstruction —— 并查集find()函数
  4. c#使用itextsharp输出pdf(动态填充表单内容,显示中文)
  5. React之组件小析
  6. 利用jsp技术实现用户注册
  7. linux命令学习笔记(51):lsof命令
  8. poj1821 Fence(单调队列优化dp)
  9. codevs 1576最长严格上升子序列
  10. poj3013Big Chrismas Tree——树转换spfa