【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 ...
随机推荐
- 1. 用自己的算法实现startsWith和endsWith功能。
package com.xinjian; public class Chazifu { public static void main(String[] args) { String a=" ...
- updating the chroot
Ubuntu may stop working after a Chrome OS update. If that's the case, update all the installed targe ...
- replication factor
http://www.tuicool.com/articles/RJbIBj 关于Hadoop中replication factor解惑 时间 2014-06-09 08:00:50 ITeye ...
- Python 模块功能paramiko SSH 远程执行及远程下载
模块 paramiko paramiko是一个用于做远程控制的模块,使用该模块可以对远程服务器进行命令或文件操作,值得一说的是,fabric和ansible内部的远程管理就是使用的paramiko来现 ...
- 【jsp 练习】 给定三角形三边判断是否能组成三角形及计算面积
Test.java package package1; public class Test { double side1 = -1 , side2 = -1 , side3 = -1 , area = ...
- java socket解析和发送二进制报文工具(附java和C++转化问题)
解析: 首先是读取字节: /** * 读取输入流中指定字节的长度 * <p/> * 输入流 * * @param length 指定长度 * @return 指定长度的字节数组 */ pu ...
- Jquery树控件ZTree异步加载
异步加载的意思就是: 当点击展开树节点时,才去请求后台action返回点击节点的子节点数据并加载. 这里面主要设计ztree的setting变量的async属性设置: var setting = { ...
- Android OpenGL ES(三)OpenGL ES API 命名习惯 .
OpenGL ES是个跨平台的3D图形开发包规范,最常见的实现是采用C语言实现的,Android OpenGL ES 实现上是使用Java 语言对底层的C接口进行了封装,因此在android.open ...
- OpenGL-----深度测试,剪裁测试、Alpha测试和模板测试
片断测试其实就是测试每一个像素,只有通过测试的像素才会被绘制,没有通过测试的像素则不进行绘制.OpenGL提供了多种测试操作,利用这些操作可以实现一些特殊的效果.我们在前面的课程中,曾经提到了“深度测 ...
- UVA - 11732 "strcmp()" Anyone?左兄弟右儿子trie
input n 2<=n<=4000 s1 s2 ... sn 1<=len(si)<=1000 output 输出用strcmp()两两比较si,sj(i!=j)要比较的次数 ...