BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution
标题效果:一个N积分m无向图边。它可以是路径k右边缘值变0,确定此时1-n最短路径长度。
Sol:我以为我们考虑分层图,图复制k+1部分,每间0~k一层。代表在这个时候已经过去“自由边缘”文章编号。
层与层之间的边权值为0且为单向由上层指向下层。
这样我们以0层的1点做单源最短路径。每一层的n点的距离最小值即为答案。
仅仅只是这种点数为O(K*N),边数为O(K*M),比較慢。
我的做法是,对每一层使用heap-dijkstra算法由本层的原点更新这一层的最短路长度。然后显然能够用O(m)的复杂度推知下一层的初始最短路长度。
这样的做法显然空间和时间上均存在较大优势。
Code:
#include <cstdio>
#include <cstring>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std; inline int getc() {
static const int L = 1 << 15;
static char buf[L], *S = buf, *T = buf;
if (S == T) {
T = (S = buf) + fread(buf, 1, L, stdin);
if (S == T)
return EOF;
}
return *S++;
}
inline int getint() {
int c;
while(!isdigit(c = getc()));
int tmp = c - '0';
while(isdigit(c = getc()))
tmp = (tmp << 1) + (tmp << 3) + c - '0';
return tmp;
} typedef long long LL; #define N 10010
#define M 50010
int n, m, k;
int head[N], next[M << 1], end[M << 1], len[M << 1];
LL dis[2][N];
bool inpath[N]; queue<int> q; void addedge(int a, int b, int _len) {
static int q = 1;
len[q] = _len;
end[q] = b;
next[q] = head[a];
head[a] = q++;
}
void make(int a, int b, int _len) {
addedge(a, b, _len);
addedge(b, a, _len);
} struct Node {
int lab, dis;
Node(int _lab = 0, int _dis = 0):lab(_lab),dis(_dis){}
bool operator < (const Node &B) const {
return (dis < B.dis) || (dis == B.dis && lab < B.lab);
}
};
struct Heap {
Node a[N];
int top, ch[N];
Heap():top(0){}
void up(int x) {
for(; x != 1; x >>= 1) {
if (a[x] < a[x >> 1]) {
swap(ch[a[x].lab], ch[a[x >> 1].lab]);
swap(a[x], a[x >> 1]);
}
else
break;
}
}
void down(int x) {
int son;
for(; x << 1 <= top; ) {
son=(((x<<1)==top)||(a[x<<1]<a[(x<<1)|1]))?(x<<1):((x<<1)|1);
if (a[son] < a[x]) {
swap(ch[a[son].lab], ch[a[x].lab]);
swap(a[son], a[x]);
x = son;
}
else
break;
}
}
void insert(Node x) {
a[++top] = x;
ch[x.lab] = top;
up(top);
}
Node Min() {
return a[1];
}
void pop() {
a[1] = a[top];
ch[a[top--].lab] = 1;
down(1);
}
void change(int x, int to) {
int ins = ch[x];
a[ins].dis = to;
up(ins);
}
}H; void Dijkstra(bool d) {
H.top = 0;
int i, j;
memset(inpath, 0, sizeof(inpath));
for(i = 1; i <= n; ++i)
H.insert(Node(i, dis[d][i]));
for(i = 1; i <= n; ++i) {
Node tmp = H.Min();
H.pop();
inpath[tmp.lab] = 1;
for(j = head[tmp.lab]; j; j = next[j]) {
if (!inpath[end[j]] && dis[d][end[j]] > dis[d][tmp.lab] + len[j]) {
dis[d][end[j]] = dis[d][tmp.lab] + len[j];
H.change(end[j], dis[d][end[j]]);
}
}
}
} int main() {
n = getint();
m = getint();
k = getint(); int i, j;
int a, b, x;
for(i = 1; i <= m; ++i) {
a = getint();
b = getint();
x = getint();
make(a, b, x);
} int now = 0, last = 1; memset(dis, 0x3f, sizeof(dis));
dis[now][1] = 0;
Dijkstra(now);
LL ans = dis[now][n]; while(k--) {
now ^= 1;
last ^= 1;
for(i = 1; i <= n; ++i)
dis[now][i] = dis[last][i];
for(i = 1; i <= n; ++i)
for(j = head[i]; j; j = next[j])
dis[now][end[j]] = min(dis[now][end[j]], dis[last][i]);
Dijkstra(now);
if (ans == dis[now][n])
break;
ans = dis[now][n];
} printf("%lld", ans); return 0;
}
版权声明:本文博主原创文章。博客,未经同意不得转载。
BZOJ1579 USACO 2009 Feb Gold 3.Revamping Trails Solution的更多相关文章
- BZOJ1577 USACO 2009 Feb Gold 1.Fair Shuttle Solution
权限题,不给传送门啦!在学校OJ上交的.. 有些不开心,又是一道贪心,又是一个高级数据结构的模板,又是看了别人的题解还写崩了QAQ,蒟蒻不需要理由呀. 正经题解: 首先,我们可以由「显然成立法」得出, ...
- [USACO 2009 Feb Gold] Fair Shuttle (贪心+优先队列)
题目大意:有N个站点的轻轨站,有一个容量为C的列车起点在1号站点,终点在N号站点,有K组牛群,每组数量为Mi(1≤Mi≤N),行程起点和终点分别为Si和Ei(1≤Si<Ei≤N).计算最多有多少 ...
- [USACO 2018 Feb Gold] Tutorial
Link: USACO 2018 Feb Gold 传送门 A: $dp[i][j][k]$表示前$i$个中有$j$个0且末位为$k$的最优解 状态数$O(n^3)$ #include <bit ...
- USACO 2009 Feb 股票市场 Stock Market
USACO 2009 Feb 股票市场 Stock Market Description 尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气.贝西开挂了,她知道S ...
- 道路翻新 (Revamping Trails, USACO 2009 Feb)
题意:给定m<=50000的1-n有联通的图,求最多可以使K<=20条边变为0的情况下的最短路是多少.. 思路:简单的分层图最短路,对于每个点拆成K个点.. 然后求一边最短路.. code ...
- [USACO 2012 Feb Gold] Cow Coupons【贪心 堆】
传送门1:http://www.usaco.org/index.php?page=viewproblem2&cpid=118 传送门2:http://www.lydsy.com/JudgeOn ...
- 【BZOJ】【3398】【USACO 2009 Feb】Bullcow 牡牛和牝牛
组合计数/乘法逆元 排列组合求总方案数 这个可以用一个一维的动态规划解决: f[i][0]表示第i头牛是牝牛的方案数 f[i][1]表示第i头牛是牡牛的方案数 则转移为:f[i][0]=f[i-1][ ...
- bzoj3939 【USACO 2015 FEB GOLD 】cow hopscotch
Description 就像人类喜欢玩"跳房子"的游戏,农民约翰的奶牛已经发明了该游戏的一个变种自己玩.由于笨拙的动物体重近一吨打,牛跳房子几乎总是以灾难告终,但这是没有阻止奶牛几 ...
- BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap
题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...
随机推荐
- 代码重构 & 代码中的坏味道
1.重构 1.1 为什么要重构 1.1.1 改进程序设计 程序员为了快速完成任务,在没有完全理解整体架构之前就开始写代码, 导致程序逐渐失去自己的结构.重构则帮助重新组织代码,重新清晰的体现 程序结构 ...
- 【SSH 基础】浅谈Hibernate关系映射(4)
继上篇博客 多对多关联映射(单向) 多对多对象关系映射,须要增加一张新表完毕基本映射. Hibernate会自己主动生成中间表 Hibernate使用many-to-many标签来表示多对多的关联,多 ...
- sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在使用Hibernate的J2EE项目中,莫名其妙出现如上错误,既不报错,也不运行不论什么输出測试代码,更不返回结果. 经过排查,在方法里面引用的实体类和其映射文件属性个数不一致. 改动一致后,即解决 ...
- 大话设计模式C++达到-文章12章-外观模式
一.UML画画 关键词:添加Facade层. 二.概念 外观模式:为子系统中的一组接口提供一个一致的界面.此模式定义了一个高层接口,这个接口使得这一子系统更加easy使用. 三.说明 Q:外观模式在什 ...
- 10gocm->session5->数据库管理实验
Oracle数据库管理实验 一 传输表空间 二 创建分区表和分区索引 三 FGA细粒度审计 四 监控索引使用情况 五 创建含特殊字段类型的表 六 Flashback闪回技术 一 传输表空间,将ocmd ...
- OCA读书笔记(18) - 使用Support工具
调查和解决问题 问题:数据库中的任一严重的错误定义为一个问题,一般来说,这些错误包括大家熟悉的ORA-600错误和ORA-04031(共享池超出)错误,涉及数据库问题的所有元数据都存储在ADR中,每个 ...
- Visual Studio Tips: How to change project namespace
/* Author: Jiangong SUN */ If you want to modify a project's namespace and its physical container na ...
- [置顶] 如何vs在cocos2dx项目中打印中文
一开始不是很理解,查了半天资料,终于找到解决方法,但是有部分中文还是不能打印出来,如 会出现部分的中文, 一开始都是问号的解决方法是 点击高级保存选项 设置成Unicode(UTF-8无签名) 这样就 ...
- [ACM] hdu 5045 Contest (减少国家Dp)
Contest Problem Description In the ACM International Collegiate Programming Contest, each team consi ...
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...