[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 ...
随机推荐
- Android中WebView的跨域漏洞分析和应用被克隆问题情景还原(免Root获取应用沙盒数据)
一.前言 去年年底支付宝的被克隆漏洞被爆出,无独有偶就是腾讯干的,其实真正了解这个事件之后会发现,感觉是针对支付宝.因为这个漏洞找出肯定花费了很大劲,主要是因为支付宝的特殊业务需要开启了WebView ...
- HDOJ(HDU).1412 {A} + {B} (STL SET)
HDOJ(HDU).1412 {A} + {B} (STL SET) 点我挑战题目 题意分析 大水题,会了set直接用set即可. 利用的是set的互异性(同一元素有且仅有一项). #include ...
- 从零开始学Linux系统(一)之引导流程解析
Linux系统:分时多用户多任务的操作系统: Linux系统引导流程: inittab配置文件中: 定义了linux系统的运行的7个级别:从0~6 0.6:分别代表关机和重启,不建议设置为默认的运行级 ...
- [BZOJ1106/POI2007]Tet立方体大作战
Description 一个叫做立方体大作战的游戏风靡整个Byteotia.这个游戏的规则是相当复杂的,所以我们只介绍他的简单规则:给定玩家一个有2n个元素的栈,元素一个叠一个地放置.这些元素拥有n个 ...
- 直通BAT面试算法精讲课 --动态规划
1.有数组penny,penny中所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法. 给定数 ...
- 使用canvas画一个雷达效果图的特效代码
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- #define与typedef
#define(宏定义)只是简单的字符串代换(原地扩展),它本身并不在编译过程中进行,而是在这之前(预处理过程)就已经完成了. typedef是为了增加可读性而为标识符另起的新名称(仅仅只是个别名), ...
- springboot的application.properties与.yml的区别
现在我们的application.properties文件内容是: server.port=8090 server.session-timeout=30 server.context-path= se ...
- 手脱ASProtect v1.23 RC1(有Stolen Code)之以壳解壳
1.载入PEID ASProtect v1.23 RC1 2.载入OD,不勾选内存访问异常,其他异常全部勾选 > 01C06D00 push SoWorker.006DC001 ; //入口点 ...
- FreeRTOS - 程序开发阶段建议
1.创建任务.定时器等都需要耗用分配给FreeRTOS的heap,由于RAM有限,分配作为FreeRTOS的heap量有限,一不小心就不够用了,所以应该有检测任务.定时器等是否创建成功,如下图: 2. ...