[USACO06NOV]路障---严格次短路
Description
贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个。贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地)。 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多次。当然咯,第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。
Solution
今天考试的第三题, 出个这么水的原题是什么意思?
不巧的是一个多月前我刚做过, 更不巧的是今天做错了.
Code
这是我之前的代码, 那时候我还是个用指针建图的少年.
#include <queue>
#include <stdio.h>
#include <string.h>
#include <algorithm>
const int N = 40005;
const int inf = 0x3f3f3f3f;
using std:: queue;
using std:: pair;
using std:: make_pair;
#define Read(___) scanf("%d", &___)
struct Edge {
int v, c; Edge *nxt;
Edge() : nxt(NULL), v(0), c(inf) {}
Edge(int _, int __) : nxt(NULL), v(_), c(__) {}
};
class Graph {
int n, m, vis[N];
Edge *head[N];
public:
Graph(int _) { n = _; for (int i = 0; i <= n; i += 1) head[i] = new Edge(); }
void AddEdge(int u, int v, int c) {
Edge *tmp = head[u], *t = new Edge(v, c); t->nxt = tmp, head[u] = t;
}
void InitGraph(int m, bool isdirect, int val) {
int u, v, c = val;
for (int i = 0; i < m; i += 1) {
scanf("%d%d", &u, &v); if (!val) scanf("%d", &c);
AddEdge(u, v, c); if (isdirect) AddEdge(v, u, c);
}
}
void MinDistance(int s, int *dis) {
memset(dis, 0x3f, 4 * n + 4);
memset(vis, false, 4 * n + 4);
queue<int> que;
que.push(s), vis[s] = true, dis[s] = 0;
for (int top; !que.empty(); que.pop()) {
top = que.front(); vis[top] = false;
for (Edge *t = head[top]; t; t = t->nxt) {
if (dis[t->v] > dis[top] + t->c) {
dis[t->v] = dis[top] + t->c;
if (!vis[t->v]) vis[t->v] = true, que.push(t->v);
}
}
}
}
#define P pair<int,int>
void SecondaryShortCircuit(int s, int *dis, int *sdis) {
memset(dis, 0x3f, 4 * n + 4);
memset(sdis, 0x3f, 4 * n + 4);
std:: priority_queue<P, std:: vector<P> , std:: greater<P> >que;
dis[s] = 0, que.push(make_pair(0, 1));
for (P top; !que.empty(); que.pop()) {
top = que.top(); int t = top.second, d = top.first;
if (sdis[t] < top.first) continue;
for (Edge *i = head[t]; i; i = i->nxt) {
int D = d + i->c;
if (dis[i->v] > D) {
std:: swap(dis[i->v], D);
que.push(make_pair(dis[i->v], i->v));
}
if (sdis[i->v] > D and dis[i->v] < D) {
sdis[i->v] = D;
que.push(make_pair(sdis[i->v], i->v));
}
}
}
}
};
int d1[N], d2[N], d3[N];
int main () {
int n, m; scanf("%d%d", &n, &m);
Graph *G = new Graph(n); G->InitGraph(m, 1, 0);
G->SecondaryShortCircuit(1, d1, d2);
printf("%d", d2[n]);
return 0;
}
[USACO06NOV]路障---严格次短路的更多相关文章
- luogu2865 [USACO06NOV]路障Roadblocks 次短路
注意:如果是这么个写法,堆数组要开成n+m的. 为什么呢?设想一下从1到2有m条长度递减的路,这岂不是要入队m次-- #include <algorithm> #include <i ...
- 洛谷P2865 [USACO06NOV]路障Roadblocks——次短路
给一手链接 https://www.luogu.com.cn/problem/P2865 这道题其实就是在维护最短路的时候维护一下次短路就okay了 #include<cstdio> #i ...
- P2865 [USACO06NOV]路障Roadblocks
P2865 [USACO06NOV]路障Roadblocks 最短路(次短路) 直接在dijkstra中维护2个数组:d1(最短路),d2(次短路),然后跑一遍就行了. attention:数据有不同 ...
- 洛谷——P2865 [USACO06NOV]路障Roadblocks
P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...
- 络谷 P2865 [USACO06NOV]路障Roadblocks
P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...
- P2865 【[USACO06NOV]路障Roadblocks】(次短路)
传送门 算法Dijkstra要求次短路 那么在不考虑重复走一条边的情况下 肯定是把最短路中的一段改成另一段 至少要换另一条边到路径里所以可以枚举所有不属于最短路的每条边(a,b) 那么dis(1,a) ...
- 【洛谷 P2865】 [USACO06NOV]路障Roadblocks(最短路)
题目链接 次短路模板题. 对每个点记录最短路和严格次短路,然后就是维护次值的方法了. 和这题一样. #include <cstdio> #include <queue> #in ...
- BZOJ 1726 洛谷 2865 [USACO06NOV]路障Roadblocks【次短路】
·求1到n的严格次短路. [题解] dijktra魔改?允许多次入队,改了次短路的值也要入队. #include<cstdio> #include<algorithm> #de ...
- 洛谷题解 P2865 【[USACO06NOV]路障Roadblocks】
链接:https://www.luogu.org/problemnew/show/P2865 题目描述 Bessie has moved to a small farm and sometimes e ...
随机推荐
- BZOJ5335:[TJOI2018]智力竞赛——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5335 小豆报名参加智力竞赛,他带上了n个好朋友作为亲友团一块来参加比赛. 比赛规则如下: 一共有m ...
- BZOJ1070:[SCOI2007]修车——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1070 https://www.luogu.org/problemnew/show/P2053#sub ...
- BZOJ3343 & 洛谷2801:教主的魔法——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3343 https://www.luogu.org/problemnew/show/2801 题目描述 ...
- React注释
React中注释有以下三种 var content = ( <Nav> {/* 一般注释, 用 {} 包围 */} <Person /* 多 行 注释 */ name={window ...
- 剑桥offer(51~60)
51.题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode { ...
- Codeforces Round #333 (Div. 2) B
B. Approximating a Constant Range time limit per test 2 seconds memory limit per test 256 megabytes ...
- Qt ------- QByteArray操作注意
使用QByteArray方法把数据存入QByteArray需要是char型数据,如果需要存入无符号8位数据,如下: QByteArray data; data[0] = 0xFF; 即使通过data[ ...
- 神奇的sed替换
1. 替换含有某关键字的行 $ sed 's/.*ami-07bc4ae4d4d662f53.*/ami = "ami-07bc4ae4d4d662f53898989898989" ...
- 基于http的追加协议、构建web内容的技术、web的攻击技术(9,10,11)
第九章 基于http的追加协议 用来提升http的瓶颈,比如Ajax技术,spdy等 第十章 构建web内容的技术 html.css.js等 第十一章 web的攻击技术 比如sql注入攻击.xss等.
- List<Hashtable>排序
hashtableList.Sort( delegate (Hashtable a, Hashtable b) { DateTime dateTime1 = (DateTime)a["ber ...