[BZOJ1726][Usaco2006 Nov]Roadblocks第二短路
1726: [Usaco2006 Nov]Roadblocks第二短路
Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1277 Solved: 607 [Submit][Status][Discuss]Description
贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个。贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地)。 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多次。当然咯,第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。
Input
* 第1行: 两个整数,N和R,用空格隔开
* 第2..R+1行: 每行包含三个用空格隔开的整数A、B和D,表示存在一条长度为 D(1 <= D <= 5000)的路连接农场A和农场B
Output
* 第1行: 输出一个整数,即从农场1到农场N的第二短路的长度
Sample Input
4 4
1 2 100
2 4 200
2 3 250
3 4 100
1 2 100
2 4 200
2 3 250
3 4 100
Sample Output
450
输出说明:
最短路:1 -> 2 -> 4 (长度为100+200=300)
第二短路:1 -> 2 -> 3 -> 4 (长度为100+250+100=450)
输出说明:
最短路:1 -> 2 -> 4 (长度为100+200=300)
第二短路:1 -> 2 -> 3 -> 4 (长度为100+250+100=450)
次短路模板题
#include <queue> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; char buf[10000000], *ptr = buf - 1; inline int readint(){ int n = 0; char ch = *++ptr; while(ch < '0' || ch > '9') ch = *++ptr; while(ch <= '9' && ch >= '0'){ n = (n << 1) + (n << 3) + ch - '0'; ch = *++ptr; } return n; } const int maxn = 5000 + 10, maxm = 100000 + 10; struct Edge{ int to, val, next; Edge(){} Edge(int _t, int _v, int _n): to(_t), val(_v), next(_n){} }e[maxm * 2]; int fir[maxn] = {0}, cnt = 0; inline void ins(int u, int v, int w){ e[++cnt] = Edge(v, w, fir[u]); fir[u] = cnt; e[++cnt] = Edge(u, w, fir[v]); fir[v] = cnt; } struct Node{ int dis, idx; Node(){} Node(int _d, int _i): dis(_d), idx(_i){} bool operator < (const Node &x) const { return dis > x.dis; } }t; priority_queue<Node> q; int dis1[maxn], dis2[maxn]; void dijkstra(){ memset(dis1, 0x3f, sizeof dis1); memset(dis2, 0x3f, sizeof dis2); dis1[1] = 0; q.push(Node(0, 1)); int u, v, w; while(!q.empty()){ t = q.top(); q.pop(); u = t.idx; if(t.dis > dis2[u]) continue; for(int i = fir[u]; i; i = e[i].next){ v = e[i].to; w = t.dis + e[i].val; if(dis1[v] > w){ swap(dis1[v], w); q.push(Node(dis1[v], v)); } if(dis1[v] < w && w < dis2[v]){ dis2[v] = w; q.push(Node(dis2[v], v)); } } } } int n, m; int main(){ fread(buf, sizeof(char), sizeof(buf), stdin); n = readint(); m = readint(); for(int u, v, w, i = 1; i <= m; i++){ u = readint(); v = readint(); w = readint(); ins(u, v, w); } dijkstra(); printf("%d\n", dis2[n]); return 0; }