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]路障---严格次短路的更多相关文章

  1. luogu2865 [USACO06NOV]路障Roadblocks 次短路

    注意:如果是这么个写法,堆数组要开成n+m的. 为什么呢?设想一下从1到2有m条长度递减的路,这岂不是要入队m次-- #include <algorithm> #include <i ...

  2. 洛谷P2865 [USACO06NOV]路障Roadblocks——次短路

    给一手链接 https://www.luogu.com.cn/problem/P2865 这道题其实就是在维护最短路的时候维护一下次短路就okay了 #include<cstdio> #i ...

  3. P2865 [USACO06NOV]路障Roadblocks

    P2865 [USACO06NOV]路障Roadblocks 最短路(次短路) 直接在dijkstra中维护2个数组:d1(最短路),d2(次短路),然后跑一遍就行了. attention:数据有不同 ...

  4. 洛谷——P2865 [USACO06NOV]路障Roadblocks

    P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...

  5. 络谷 P2865 [USACO06NOV]路障Roadblocks

    P2865 [USACO06NOV]路障Roadblocks 题目描述 Bessie has moved to a small farm and sometimes enjoys returning ...

  6. P2865 【[USACO06NOV]路障Roadblocks】(次短路)

    传送门 算法Dijkstra要求次短路 那么在不考虑重复走一条边的情况下 肯定是把最短路中的一段改成另一段 至少要换另一条边到路径里所以可以枚举所有不属于最短路的每条边(a,b) 那么dis(1,a) ...

  7. 【洛谷 P2865】 [USACO06NOV]路障Roadblocks(最短路)

    题目链接 次短路模板题. 对每个点记录最短路和严格次短路,然后就是维护次值的方法了. 和这题一样. #include <cstdio> #include <queue> #in ...

  8. BZOJ 1726 洛谷 2865 [USACO06NOV]路障Roadblocks【次短路】

    ·求1到n的严格次短路. [题解] dijktra魔改?允许多次入队,改了次短路的值也要入队. #include<cstdio> #include<algorithm> #de ...

  9. 洛谷题解 P2865 【[USACO06NOV]路障Roadblocks】

    链接:https://www.luogu.org/problemnew/show/P2865 题目描述 Bessie has moved to a small farm and sometimes e ...

随机推荐

  1. 【CodeChef】Palindromeness(回文树)

    [CodeChef]Palindromeness(回文树) 题面 Vjudge CodeChef 中文版题面 题解 构建回文树,现在的问题就是要求出当前回文串节点的长度的一半的那个回文串所代表的节点 ...

  2. BZOJ3339:Rmq Problem & BZOJ3585 & 洛谷4137:mex——题解

    前者:https://www.lydsy.com/JudgeOnline/problem.php?id=3339 后者: https://www.lydsy.com/JudgeOnline/probl ...

  3. BZOJ2434 [Noi2011]阿狸的打字机 【AC自动机 + fail树 + 树状数组】

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 3610  Solved: 1960 [Submit][S ...

  4. java里的 懒汉和恶汉模式-----讲解

    ------------java中的恶汉模式 public void Test{ private static Test inte = new Test(); // 内部自己创建好实例,私有属性(不建 ...

  5. PowerDesigner 技巧【3】

    一.PowerDesigner导出所有SQL脚本: 一般的导出SQL脚本只需要下面两个步骤: 1.database->change current DBMS(选择需要导出的数据库类型): 2.d ...

  6. FreeRTOS - 如何根据FreeRTOS提供的功能(信号量、任务通知、队列等)设计程序

    原文地址:http://www.cnblogs.com/god-of-death/p/6917837.html 1.二值信号量 就像一个标志位,事件产生置一,事件处理后直零 用于任务之间的同步,即一个 ...

  7. margin和padding

    一.margin基础语法与结构 1.margin语法 Margin:10px Margin的值是数字+html单位,同时也可以为auto(自动.自适应) 2.应用结构 Div{margin:10px} ...

  8. [ASP.NET]从ASP.NET Postback机制,到POST/GET方法

    写这篇博客的起源来自于自己最近在学习ASP.NET时对于 PostBack机制的困惑.因为自己在解决困惑地同时,会不断产生新的疑问,因此博客最后深入到了http 包的格式和Internet所使用的TC ...

  9. 仿微信中加载网页时带线行进度条的WebView的实现

    finddreams:http://blog.csdn.net/finddreams/article/details/44172639 为了仿微信中加载网页时带进度条的WebView的实现,首先我们来 ...

  10. 安装显卡后蓝屏0x00000116解决办法

    1. 亲自遇到蓝屏的问题. 2. 进入安全模式后重装系统,成功. 3. 安装驱动,软件没毛病.安装显卡驱动后,蓝屏. 4. 查看蓝屏错误代码0x00000116, 百度后查看到是显卡驱动的问题. 5. ...