1579: [Usaco2009 Feb]Revamping Trails 道路升级

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 2206  Solved: 622
[Submit][Status][Discuss]

Description

每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i (1 <= P1_i <= N; 1 <= P2_i<= N). John需要T_i (1 <= T_i <= 1,000,000)时间单位用道路i从P1_i走到P2_i或者从P2_i 走到P1_i 他想更新一些路经来减少每天花在路上的时间.具体地说,他想更新K (1 <= K <= 20)条路经,将它们所须时间减为0.帮助FJ选择哪些路经需要更新使得从1到N的时间尽量少.

Input

* 第一行: 三个空格分开的数: N, M, 和 K * 第2..M+1行: 第i+1行有三个空格分开的数:P1_i, P2_i, 和 T_i

Output

* 第一行: 更新最多K条路经后的最短路经长度.

Sample Input

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

Sample Output

1

HINT

K是1; 更新道路3->4使得从3到4的时间由100减少到0. 最新最短路经是1->3->4,总用时为1单位. N<=10000

题目链接:

    http://www.lydsy.com/JudgeOnline/problem.php?id=1579

Solution

    f [ i ] [ j ] 表示修改了 i 次,从 1 到 i 的最短路。。。

    然后做法就很显然了。。。每次先枚举修改哪条边,然后跑一遍最短路。。。

    之前写spfa莫名爆炸。。最后只好用dijkstra水过。。。。。。

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#define N 2000050
#define LL long long
using namespace std;
int n,m,k,cnt=0;
struct edge{
int r,nxt,v;
}e[200000];
bool vis[N];
int f[N],d[N];
int hed[N];
void insert(int u,int v,int w){
e[++cnt].r=v;e[cnt].v=w;e[cnt].nxt=hed[u];hed[u]=cnt;
e[++cnt].r=u;e[cnt].v=w;e[cnt].nxt=hed[v];hed[v]=cnt;
}
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >Q;
void spfa(){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
if(f[i]==-1)continue;
Q.push(make_pair(f[i],i) );
}
int now;
LL G;
while( !Q.empty() ){
now=Q.top().second;
G=Q.top().first;
Q.pop();
if(vis[now])continue;
vis[now]=1;
for(int i=hed[now];i;i=e[i].nxt){
if(vis[e[i].r])continue;
if(e[i].v+G<f[e[i].r]||f[e[i].r]==-1){
f[e[i].r]=e[i].v+G;
Q.push(make_pair(f[e[i].r],e[i].r) );
}
}
}
}
int main(){
int u,v,w;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
insert(u,v,w);
}
for(int i=1;i<=n;i++)f[i]=-1;
f[1]=0;
int ans=-1;
spfa();
if(f[n]<ans||ans==-1)ans=f[n];
for(int j=1;j<=k;j++){
for(int i=1;i<=n;i++){
d[i]=f[i];
f[i]=-1;
}
for(int i=1;i<=n;i++){
if(!~d[i])continue;
for(int l=hed[i];l;l=e[l].nxt)
if( (d[i]<f[e[l].r]) || (!~f[e[l].r]) )
f[e[l].r]=d[i];
}
spfa();
if(f[n]<ans||ans==-1)ans=f[n];
}
printf("%d\n",ans);
return 0;
}

  

  

This passage is made by Iscream-2001.

BZOJ 1579--道路升级(DP&最短路)的更多相关文章

  1. BZOJ 1579 道路升级 Dijkstra

    思路: 这道题 不能把所有边都建出来 会MLE的!!! oh gosh 其实不建所有的边 用的时候再调就行了-.(也没啥区别) //By SiriusRen #include <queue> ...

  2. 【BZOJ 1579】 1579: [Usaco2009 Feb]Revamping Trails 道路升级 (最短路)

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M< ...

  3. BZoj 1003 物流运输 DP+最短路

    2013-09-11 09:56 W[I]代表前I天能取得的最小花费,假设在第J天更改一次路线,那么如果有 W[I]>W[J]+第j+1到第I天的最小花费+更改路线的花费(K) 那么更新W[I] ...

  4. BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )

    最短路...多加一维表示更新了多少条路 -------------------------------------------------------------------------------- ...

  5. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 -- 分层图最短路

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MB Description 每天,农夫 ...

  6. bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 优先队列+dij

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1768  Solv ...

  7. Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1573  Solv ...

  8. BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路

    BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...

  9. 分层图最短路 【bzoj1579】[Usaco2009 Feb]Revamping Trails 道路升级

    1579: [Usaco2009 Feb]Revamping Trails 道路升级 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M< ...

随机推荐

  1. 用JDK自带的包来解析XML文件(DOM+xpath)

    DOM编程不要其它的依赖包,因为JDK里自带的JDK里含有的上面提到的org.w3c.dom.org.xml.sax 和javax.xml.parsers包就可以满意条件了.(1)org.w3c.do ...

  2. 使用java代码编辑oracle数据库

    package com.hanqi; import java.io.IOException; import java.sql.Connection; import java.sql.DriverMan ...

  3. Unity Shader-简单均值模糊

    http://blog.csdn.net/puppet_master/article/details/52547442 与Amplify中的Simple Blur例子实现一样

  4. Python 入门学习(壹)上机时间提醒

    基于 Udacity 的 Python 入门课程 Programming Foundations with Python 基于 Python 2.7 控制台版本 思路 Project 1 是一个时间提 ...

  5. Qt Thread

    Threading Classes (Qt help manual key words) These Qt Core classes provide threading support to appl ...

  6. git best practice

    1. https://www.atlassian.com/git/tutorials/learn-git-with-bitbucket-cloud (atlassian家的git) 2. https: ...

  7. Vue 路由缓存

    问题 在路由切换时不需要每次 点击都刷新子路由   尤其是在form表单的情况下  不能让用户 输入一半之后点击其他页面  再点回来 表单数据不见了 解决方案   vue 2.0     之中  有k ...

  8. [Selenium]怎样验证页面是否有无变化

    验证方法:将两次的Dom结构进行对比 String beforeStr = (String) SeleniumUtil.getInnerHTML(page.getDriver(), page.getD ...

  9. Spring boot——logback.xml 配置详解(四)<filter>

    阅读目录 1 filter的使用 2 常用的过滤器 文章转载自:http://aub.iteye.com/blog/1101260,在此对作者的辛苦表示感谢! 回到顶部 1 filter的使用 < ...

  10. redis centos 上以 tar.gz 安装redis

    1.下载安装文件#wget http://download.redis.io/releases/redis-3.2.3.tar.gz 2.删除文件 rm -rf /usr/local/redisrm ...