【BZOJ 1579】 1579: [Usaco2009 Feb]Revamping Trails 道路升级 (最短路)
1579: [Usaco2009 Feb]Revamping Trails 道路升级
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 100Sample Output
1HINT
K是1; 更新道路3->4使得从3到4的时间由100减少到0. 最新最短路经是1->3->4,总用时为1单位. N<=10000
Source
【分析】
就是一个分层图最短路,spfa过不了。。所以这是我第一次打迪杰斯特拉???
dij:分st,ed,两个联盟,每次找dis最小的x加入st联盟,根据他连出去的边更新dis,然后继续做。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
#define Maxn 10010
#define Maxm 50010
#define Maxk 25
#define INF 0xfffffff struct node
{
int x,y,c,next;
}t[*Maxm];int len=; int first[Maxn];
int n,m,k; void ins(int x,int y,int c)
{
t[++len].x=x;t[len].y=y;t[len].c=c;
t[len].next=first[x];first[x]=len;
} int mymin(int x,int y) {return x<y?x:y;} int id[Maxn][Maxk],wh[Maxn*Maxk][];
int cnt=; struct hp
{
int d,x;
friend bool operator < (hp x,hp y)
{
return x.d>y.d;
}
}; bool mark[Maxn*Maxk];
int dis[Maxn*Maxk];
priority_queue<hp > q;
void dij(int st)
{
while(!q.empty()) q.pop();
memset(mark,,sizeof(mark));
memset(dis,,sizeof(dis));
q.push((hp){,st});dis[st]=;
while(!q.empty())
{
while(!q.empty()&&mark[q.top().x]) q.pop();
if(q.empty()) break;
hp x=q.top();q.pop();
int xx=wh[x.x][],kk=wh[x.x][];
mark[x.x]=;
for(int i=first[xx];i;i=t[i].next)
{
int y=t[i].y;
if(mark[id[y][kk]]) continue;
if(dis[id[y][kk]]>dis[x.x]+t[i].c)
{
dis[id[y][kk]]=dis[x.x]+t[i].c;
q.push((hp){dis[id[y][kk]],id[y][kk]});
}
if(kk<k)
{
if(dis[id[y][kk+]]>dis[x.x])
{
dis[id[y][kk+]]=dis[x.x];
q.push((hp){dis[id[y][kk+]],id[y][kk+]});
}
}
}
}
} int main()
{
scanf("%d%d%d",&n,&m,&k);
memset(first,,sizeof(first)); for(int i=;i<=n;i++)
for(int j=;j<=k;j++)
id[i][j]=++cnt,wh[cnt][]=i,wh[cnt][]=j; for(int i=;i<=m;i++)
{
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
ins(x,y,c);ins(y,x,c);
} dij(id[][]);
int ans=INF;
for(int i=;i<=k;i++) ans=mymin(ans,dis[id[n][i]]);
printf("%d\n",ans);
return ;
}
2017-01-15 10:48:33
【BZOJ 1579】 1579: [Usaco2009 Feb]Revamping Trails 道路升级 (最短路)的更多相关文章
- BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级( 最短路 )
最短路...多加一维表示更新了多少条路 -------------------------------------------------------------------------------- ...
- Bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 dijkstra,堆,分层图
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1573 Solv ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 -- 分层图最短路
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MB Description 每天,农夫 ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级 优先队列+dij
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1768 Solv ...
- 分层图最短路 【bzoj1579】[Usaco2009 Feb]Revamping Trails 道路升级
1579: [Usaco2009 Feb]Revamping Trails 道路升级 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M< ...
- BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路
BZOJ_1579_[Usaco2009 Feb]Revamping Trails 道路升级_分层图最短路 Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M ...
- BZOJ 1579 [Usaco2009 Feb]Revamping Trails 道路升级:dijkstra 分层图【将k条边改为0】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1579 题意: 给你一个无向图,n个点,m条边,每条边有边权w[i]. 你可以将其中的k(k ...
- bzoj 1579: [Usaco2009 Feb]Revamping Trails 道路升级——分层图+dijkstra
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
- BZOJ 1579: [Usaco2009 Feb]Revamping Trails 道路升级 分层图最短路 + Dijkstra
Description 每天,农夫John需要经过一些道路去检查牛棚N里面的牛. 农场上有M(1<=M<=50,000)条双向泥土道路,编号为1..M. 道路i连接牛棚P1_i和P2_i ...
随机推荐
- InjectAPC全部项目(Win32和Win64位)
// InjectAPC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #inclu ...
- hdu_5734_Acperience
题目连接:hdu_5734_Acperience 多校的题我还是贴官方题解的好,方便快捷,省事!! #include<cstdio> #include<cmath> #defi ...
- hdu_4734_F(x)(数位DP水)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 题意:给你一个F(x)的定义,然后给你a,b,问你在0到b包括b有多少个数满足F(x)<= ...
- 第一个WebAPI项目
(1)新建一个ASP.NET MVC项目,取名为:MyMvcWebAPIDemo,项目类型选择WebAPI. (2)在Models中新增一个类,取名为:Product,作为我们要测试的实体模型. ...
- 远程连接(ssh安装)
更新源列表打开"终端窗口",输入"sudo apt-get update"-->回车-->"输入当前登录用户的管理员密码"--& ...
- 安卓获取线程id
错误的做法: @Override public void onCreate() { mContext = getApplicationContext(); mHandler = new Handler ...
- android:onTouch()和onTouchEvent()的区别?看完这篇文章就知道了
Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等.这些Gesture会使用户体验大大提升. A ...
- android全屏和取消全屏 旋转屏幕
全屏 getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); 取消全屏 getWindow().clearFlags(Win ...
- 一款值得推荐的shell工具
1. 一款比较出色的shell工具 熟练的运用shell语言可以提高我们的工作效率,而一款好的shell工具能提高学习的效率,fish shell就是这样一款工具.并且是一款跨平台的工具, 同时可以在 ...
- Jquery 控制元素 上 下 移动
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...