[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 ...
随机推荐
- 解决jsp两种提交方式乱码 的方法
解决中文乱码 ---post提交方式 需要在处理页面添加request.setCharacterEncoding("utf-8"); 制定请求的编码,调用一下request.ge ...
- 常州模拟赛d7t3 水管
分析:第一问还是很好做的,关键是怎么做第二问.我们可以每次删掉最小生成树上的一条边,然后再求一次最小生成树,看边权和大小和原来的是不是一样的,不过这个做法效率很低. 考虑Kruskal算法的原理,每次 ...
- java中new一个对象放在循环体里面与外面的区别
首先说下问题: 这次在做项目的是出现了一个new对象在循环里面与外面造成的不同影响. 大家可以看到这个new的对象放在不同的位置产生的效果是不一样的. 经过多方查询与验证可以得出结论: * EasyU ...
- SQLite 学习笔记
SQLite 学习笔记. 一.SQLite 安装 访问http://www.sqlite.org/download.html下载对应的文件. 1.在 Windows 上安装 SQLite. ...
- bzoj 4206 最大团 几何+lis
最大团 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 142 Solved: 65[Submit][Status][Discuss] Descrip ...
- ASP.NET基础学习(暴力破解密码)
首先写出一段登陆程序: //ashx端 <%@ WebHandler Language="C#" Class="AddCalation" %> us ...
- 神经网络CNN训练心得--调参经验
1.样本要随机化,防止大数据淹没小数据 2.样本要做归一化.关于归一化的好处请参考:为何需要归一化处理3.激活函数要视样本输入选择(多层神经网络一般使用relu)4.mini batch很重要,几百是 ...
- Test Index
top1 top11 top2 top1 top11 top2
- (转)python编码问题
时不时总是会碰到令人头疼的编码问题,这里推荐一篇决定好文,需反复诵读之: http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html . . ...
- 南阳ACM 题目8:一种排序 Java版
一种排序 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数:现 ...