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]);}elsebreak;}}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;}elsebreak;}}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相关推荐
- BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap
题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1-N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...
- [USACO 2017 Feb Gold] Tutorial
Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h>using namespace std; #define X ...
- 【Usaco 2009 Feb】Bullcow 牡牛和牝牛
[题目] 传送门 Description 约翰要带 n(1≤n≤100000)n(1≤n≤100000)n(1≤n≤100000) 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站 ...
- USACO 2009 FEB Fair Shuttle 庙会班车 贪心
题目 题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the sh ...
- 【USACO 2009 JAN GOLD】安全路径
题目 问题描述 Gremlins最近在农场上泛滥,它们经常会阻止牛们从农庄(牛棚_1)走到别的牛棚(牛_i的目的地是牛棚_i).每一个gremlin只认识牛_i并且知道牛_i一般走到牛棚_i的最短路经 ...
- [JLOI 2011]飞行路线[USACO 09FEB]Revamping Trails
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- USACO翻译:USACO 2014 FEB SILVER 三题
USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...
- USACO翻译:USACO 2012 FEB Silver三题
USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...
- [USACO 2010 Feb S]Chocolate Eating
题目: [USACO 2010 Feb S]Chocolate Eating ,哈哈,我们今天来看一道二分答案的题嘛,这是选自USACO上的一道题,好了,我们一起来看看题意吧: 题目描述是复制的,可能 ...
最新文章
- 阿里软件测试工程师手把手教学——如何更好地设计测试用例?
- React-Amap-HOC组件封装
- Window Server 2008中开启Window Media Player功能
- CSS之Responsive设计的关键三步
- 华为云3大体系化防护实践,保障金融业云上数据安全
- 红黑树真的没你想的那么难!
- python常用代码大全-Python 网络爬虫实战项目代码大全
- SQL Server索引简介:SQL Server索引级别1
- 微软小冰你这么智能 .net知道吗?
- 菜鸟教程python爬虫小说_Python 爬虫介绍 | 菜鸟教程
- Hackintosh-OpenCore系列篇-Windows install
- java发卡系统_java毕业设计_springboot框架的自动发卡平台
- bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)
- zookeeper核心原理
- 【论文笔记】SlowFast Networks for Video Recognition
- php 查询功能,php如何实现查询功能实现
- 中英文名片拼写法对照
- npm install 报错 check python checking for Python executable python2 in the PATH
- BUAA OO第二单元作业总结
- 18 副为程序员定制的对联,总有一副适合你...流泪
热门文章
- 2021年高考成绩查询贵州一本线,2021年贵州高考一本分数线预测,今年贵州一本分数线预估多少分...
- sql取系统时间减一小时_Java秒杀系统实战系列-整体业务流程介绍与数据库设计...
- 星界边境服务器Linux,星界边境 保护与密码锁 服务器插件Mod
- linux中sar命令的选项很多,Linux sar 命令详解
- 运用div css和java_如何将css应用于div模式
- python cnn程序_python cnn训练(针对Fashion MNIST数据集)
- 在 React 中使用 TypeScript
- 同济保研计算机,同济大学保研率28%,保研高校前四:复旦、北大、交大、清华...
- oppor15android10怎么降级,OPPO R9S7.1系统怎么降回6.0版本 OPPO R9S7.1系统降级教程
- 2学习率调整_Keras的Adam优化器参数理解及自适应学习率