[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 ...
随机推荐
- POJ3264:Balanced Lineup——题解+st表解释
我早期在csdn的博客之一,正好复习st表就拿过来.http://write.blog.csdn.net/mdeditor#!postId=63713810 这道题其实本身不难(前提是你得掌握线段树或 ...
- cdh版本的sqoop安装以及配置
sqoop安装需要提前安装好sqoop依赖:hadoop .hive.hbase.zookeeper hadoop安装步骤请访问:http://www.cnblogs.com/xningge/arti ...
- POJ.1797 Heavy Transportation (Dijkstra变形)
POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...
- UVA.10986 Fractions Again (经典暴力)
UVA.10986 Fractions Again (经典暴力) 题意分析 同样只枚举1个,根据条件算出另外一个. 代码总览 #include <iostream> #include &l ...
- lighttpd - 配置文件
转载其他网站,收藏查看! 配置文件lighttpd.conf参数详细说明的链接和选译 发表于 2010年12月22日 http://redmine.lighttpd.net/projects/ligh ...
- GSM之AT操作命令详解20160615
因工作接触到GSM模块,所以收集整理了一下关于操作GSM模块的AT命令的资料: 1.AT的历史与应用 1.1 AT的历史AT命令集是由拨号调制解调器(MODEM)的发明者贺氏公司(Hayes)为了控制 ...
- SpringMVC源码解析-DispatcherServlet启动流程和初始化
在使用springmvc框架,会在web.xml文件配置一个DispatcherServlet,这正是web容器开始初始化,同时会在建立自己的上下文来持有SpringMVC的bean对象. 先从Dis ...
- bzoj4810 [Ynoi2017]由乃的玉米田 bitset优化+暴力+莫队
[Ynoi2017]由乃的玉米田 Time Limit: 30 Sec Memory Limit: 256 MBSubmit: 917 Solved: 447[Submit][Status][Di ...
- 链表系列 - [LeetCode] 链表的交错重排L1,Ln,L2,Ln-1 ....
其实一开始并没有想到时间上O(n)的方法,想到了也是空间复杂度是O(n)的(需要用到栈或者递归):链表分两段,用栈记录第一段的遍历过程. 后来经提示想到了,可以将第二段链表逆序.从而不需要额外的辅助空 ...
- jquery禁用按钮
$('#sub').click(function () { var self = $(this); ,'#01b637') ){ return false; } }); function onesho ...