BZOJ 1579--道路升级(DP&最短路)

时间:2021-04-12 09:09:01

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&gt ...

  2. 【BZOJ 1579】 1579&colon; &lbrack;Usaco2009 Feb&rsqb;Revamping Trails 道路升级 (最短路)

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

  3. BZoj 1003 物流运输 DP&plus;最短路

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

  4. BZOJ 1579&colon; &lbrack;Usaco2009 Feb&rsqb;Revamping Trails 道路升级&lpar; 最短路 &rpar;

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

  5. bzoj 1579&colon; &lbrack;Usaco2009 Feb&rsqb;Revamping Trails 道路升级 -- 分层图最短路

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

  6. bzoj 1579&colon; &lbrack;Usaco2009 Feb&rsqb;Revamping Trails 道路升级 优先队列&plus;dij

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

  7. Bzoj 1579&colon; &lbrack;Usaco2009 Feb&rsqb;Revamping Trails 道路升级 dijkstra&comma;堆&comma;分层图

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

  8. BZOJ&lowbar;1579&lowbar;&lbrack;Usaco2009 Feb&rsqb;Revamping Trails 道路升级&lowbar;分层图最短路

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

  9. 分层图最短路 【bzoj1579】&lbrack;Usaco2009 Feb&rsqb;Revamping Trails 道路升级

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

随机推荐

  1. java多线程下如何调用一个共同的内存单元(调用同一个对象)

    /* * 关于线程下共享相同的内存单元(包括代码与数据) * ,并利用这些共享单元来实现数据交换,实时通信与必要的同步操作. * 对于Thread(Runnable target)构造方法创建的线程, ...

  2. Everyday is an Opportunity

    Quote Of The Day: “Everyday is an Opportunity to Learn and Grow, Don’t Waste Your Opportunity.” – Al ...

  3. 【转】PostgreSQL IP地址访问配置

    原文:http://blog.csdn.net/shuaiwang/article/details/1793294 1.PostgreSQL的安装目录,进入data文件夹,打开postgresql.c ...

  4. SQL语句查询某字段不同数据的个数(DISTINCT 的使用)

    今天做了一个题,学到了一个知识点: 有一个高速收费表VF,如下: 统计收费涉及的车辆有多少: SQL语句: SELECT  COUNT(DISTINCT  VchReg)  from  VF ; 其中 ...

  5. 在SpringBoot中存放session到Redis

    前言 今天你们将再一次领略到SpringBoot的开发到底有多快,以及SpringBoot的思想(默认配置) 我们将使用redis存放用户的session,用户session存放策略有很多,有存放到内 ...

  6. 网络1711班 C语言第四次作业批改总结

    网络1711班 C语言第四次作业批改总结 助教有话说(写在前面) 近来,有同学跟老师和助教们反映:博客作业太多太麻烦,而且对编程能力提高似乎没什么帮助?在这里我要谈一谈我的感想. 博客作业的意义? 首 ...

  7. cd 命令的具体使用说明

    cd 命令的具体使用说明

  8. Asp&period;Net Nuget常用命令

    1.安装 Install-Package EntityFramework //ef Install-Package EntityFramework.zh-Hans //ef中文

  9. 时间戳转中国人能看得懂的日期格式 yy-mm-dd

    很多项目都会用到时间戳的转换 说实话  我现在的这家公司超级好 因为后太要求传数据的时候竟然可以是时间戳的格式 我觉得我好幸福 哈哈哈 不过 等后台转给你数据的时候很多时候都是时间戳 这时候就得前端转 ...

  10. 安装eclipse启动时报错

    1.在安装eclipse后,点击exe文件时,提示出现错误,记录在log文件中,因为log文件就是日志文件,可以方便我们排查错误,打开log文件,可以看到文件记录了每次出错的时间和错误栈信息,最新一次 ...