标题效果:一个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相关推荐

  1. BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1-N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...

  2. [USACO 2017 Feb Gold] Tutorial

    Link: 传送门 A: 分层图最短路(其实就是最短路转移时多记录一维的数据 #include <bits/stdc++.h>using namespace std; #define X ...

  3. 【Usaco 2009 Feb】Bullcow 牡牛和牝牛

    [题目] 传送门 Description 约翰要带 n(1≤n≤100000)n(1≤n≤100000)n(1≤n≤100000) 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛.牛们要站 ...

  4. USACO 2009 FEB Fair Shuttle 庙会班车 贪心

    题目 题目描述 Although Farmer John has no problems walking around the fair to collect prizes or see the sh ...

  5. 【USACO 2009 JAN GOLD】安全路径

    题目 问题描述 Gremlins最近在农场上泛滥,它们经常会阻止牛们从农庄(牛棚_1)走到别的牛棚(牛_i的目的地是牛棚_i).每一个gremlin只认识牛_i并且知道牛_i一般走到牛棚_i的最短路经 ...

  6. [JLOI 2011]飞行路线[USACO 09FEB]Revamping Trails

    Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...

  7. USACO翻译:USACO 2014 FEB SILVER 三题

    USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...

  8. USACO翻译:USACO 2012 FEB Silver三题

    USACO 2012 FEB SILVER 一.题目概览 中文题目名称 矩形草地 奶牛IDs 搬家 英文题目名称 planting cowids relocate 可执行文件名 planting co ...

  9. [USACO 2010 Feb S]Chocolate Eating

    题目: [USACO 2010 Feb S]Chocolate Eating ,哈哈,我们今天来看一道二分答案的题嘛,这是选自USACO上的一道题,好了,我们一起来看看题意吧: 题目描述是复制的,可能 ...

最新文章

  1. 阿里软件测试工程师手把手教学——如何更好地设计测试用例?
  2. React-Amap-HOC组件封装
  3. Window Server 2008中开启Window Media Player功能
  4. CSS之Responsive设计的关键三步
  5. 华为云3大体系化防护实践,保障金融业云上数据安全
  6. 红黑树真的没你想的那么难!
  7. python常用代码大全-Python 网络爬虫实战项目代码大全
  8. SQL Server索引简介:SQL Server索引级别1
  9. 微软小冰你这么智能 .net知道吗?
  10. 菜鸟教程python爬虫小说_Python 爬虫介绍 | 菜鸟教程
  11. Hackintosh-OpenCore系列篇-Windows install
  12. java发卡系统_java毕业设计_springboot框架的自动发卡平台
  13. bzoj1779 [Usaco2010 Hol]Cowwar 奶牛战争(网络流)
  14. zookeeper核心原理
  15. 【论文笔记】SlowFast Networks for Video Recognition
  16. php 查询功能,php如何实现查询功能实现
  17. 中英文名片拼写法对照
  18. npm install 报错 check python checking for Python executable python2 in the PATH
  19. BUAA OO第二单元作业总结
  20. 18 副为程序员定制的对联,总有一副适合你...流泪

热门文章

  1. 2021年高考成绩查询贵州一本线,2021年贵州高考一本分数线预测,今年贵州一本分数线预估多少分...
  2. sql取系统时间减一小时_Java秒杀系统实战系列-整体业务流程介绍与数据库设计...
  3. 星界边境服务器Linux,星界边境 保护与密码锁 服务器插件Mod
  4. linux中sar命令的选项很多,Linux sar 命令详解
  5. 运用div css和java_如何将css应用于div模式
  6. python cnn程序_python cnn训练(针对Fashion MNIST数据集)
  7. 在 React 中使用 TypeScript
  8. 同济保研计算机,同济大学保研率28%,保研高校前四:复旦、北大、交大、清华...
  9. oppor15android10怎么降级,OPPO R9S7.1系统怎么降回6.0版本 OPPO R9S7.1系统降级教程
  10. 2学习率调整_Keras的Adam优化器参数理解及自适应学习率