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

Sample Output

450
//最短路:1 -> 2 -> 4 (长度为100+200=300)
第二短路:1 -> 2 -> 3 -> 4 (长度为100+250+100=450)

这是道好题啊,相信大家第一秒看到觉得简单,稍加思考就懵逼了吧,不然也不会看到我这句话。

好了,说正经的:

这道题显然是spfa(虽然范围并不大,但是还是spfa)

其实和普通的spfa没什么两样,就是开一个存次短路的数组,然后在判断最短路径不是更优的时候判断一遍次短路径是否更优,如果是的,替换就行了

这里有一个点不得不说:在找到更优的最短路径的时候,原有的最短路径肯定变成了当前的次短路径(因为我们的目的就是在原有的最短路径上替换一条边,再使替换的这条边最短),所以我们每更新一次最短路,就要连次短路一起更新,精髓好好体会吧。

看代码(就多了一个数组和一个if):

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int sum,n,m,q[],last[];
bool used[];
long long dis[],dis2[];
struct data
{
int a,next,v;
}f[];
void ins(int u,int v,int w)
{
sum++;
f[sum].a=v;
f[sum].v=w;
f[sum].next=last[u];
last[u]=sum;
}
int main()
{
int t=,w=,now,i,u,v,x;
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)dis[i]=dis2[i]=1e15;
for(int i=;i<=m;i++)
scanf("%d%d%d",&u,&v,&x),ins(u,v,x),ins(v,u,x);
q[]=,used[]=,dis[]=;
while(t!=w)
{
now=q[t++];
if(t==n)t=;
for(i=last[now];i;i=f[i].next)
{
if(dis[now]+f[i].v<dis[f[i].a])
{
dis2[f[i].a]=dis[f[i].a];//在找到更优的最短路径的时候,原有的最短路径肯定变成了当前的次短路径
dis[f[i].a]=dis[now]+f[i].v;
if(!used[f[i].a])
{
used[f[i].a]=;
q[w++]=f[i].a;
if(w==n)w=;
}
}
else if(dis[now]+f[i].v<dis2[f[i].a]&&dis[now]+f[i].v>dis[f[i].a])
{
dis2[f[i].a]=dis[now]+f[i].v;
if(!used[f[i].a])
{
used[f[i].a]=;
q[w++]=f[i].a;
if(w==n)w=;
}
}
if(dis2[now]+f[i].v<dis2[f[i].a])
{
dis2[f[i].a]=dis2[now]+f[i].v;
if(!used[f[i].a])
{
used[f[i].a]=;
q[w++]=f[i].a;
if(w==n)w=;
}
}
}
used[now]=;
}
if(dis2[n]!=1e15)printf("%d",dis2[n]);
else printf("-1");
}

bzoj1726:[Usaco2006 Nov]Roadblocks 次短路的更多相关文章

  1. BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 768  Solved: 369[S ...

  2. BZOJ1726: [Usaco2006 Nov]Roadblocks第二短路 K短路

    Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样, ...

  3. 最短路【bzoj1726】: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...

  4. Bzoj 1726: [Usaco2006 Nov]Roadblocks第二短路 dijkstra,堆,A*,次短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 969  Solved: 468[S ...

  5. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路( 最短路 )

    从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ---------------------------------------------------------------- ...

  6. BZOJ 1726: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她 ...

  7. 1726: [Usaco2006 Nov]Roadblocks第二短路

    1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 835  Solved: 398[S ...

  8. [Usaco2006 Nov]Roadblocks第二短路

    贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的 ...

  9. 【BZOJ】1726 [Usaco2006 Nov]Roadblocks第二短路

    [算法]最短路(spfa) 次短路 [题解] 正反跑两次SPFA,然后枚举每一条边,如果起点到一个端点的最短路+另一个端点到终点的最短路+长度 ≠ 最短路,则和答案比较,保存最小值. #include ...

随机推荐

  1. [NOIP2011提高组day2]-2-聪明的质监员

    2.聪明的质监员(qc.cpp/c/pas) [问题描述] 小 T 是一名质量监督员,最近负责检验一批矿产的质量.这批矿产共有 n 个矿石,从 1到 n 逐一编号,每个矿石都有自己的重量 wi 以及价 ...

  2. BZOJ 3732 Network —— 最小生成树 + 倍增LCA

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3732 Description 给你N个点的无向图 (1 <= N <= 15, ...

  3. Kattis - whatdoesthefoxsay —— 字符串

    题目:  Kattis - whatdoesthefoxsay   Determined to discover the ancient mystery—the sound that the fox ...

  4. 关于Linux启动文件rc.local的解惑

    背景 首先,rc.local是Linux启动程序在login程序前执行的最后一个脚本,有的服务器中在rc.local中可能会有一句touch /var/lock/subsys/local,这是干什么的 ...

  5. codeforces B. George and Round 解题报告

    题目链接:http://codeforces.com/contest/387/problem/B 题目意思:给出1-n个问题,以及要满足是good rounde条件下这n个问题分别需要达到的compl ...

  6. ibatis 优点,未完版

    iBatis是Apache的一个开源项目,一个O/R Mapping(???)解决方案,iBatis最大的特点就是小巧,上手很快,如果不需要太多复杂的功能,ibatis是能满足你得要求又足够灵活的最简 ...

  7. 【转载】malloc和new

    1.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存2.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对 ...

  8. OC-内存管理的所有权链问题

    背景: 最近维护之前的项目,没有注意具体的对象之间的关系,导致了一个bug. 让我了解到对象的所有权链问题. 需要内存管理的知识: 众所周知,oc是使用引用计数来管理内存的(当一个对象被持有,他的re ...

  9. .html 页面修改成 .jsp 后缀后中文乱码解决办法。

    .html 后缀的文件,如果直接将 .html后缀改成 .jsp 后缀,则会乱码. 正确方法如下: 将如图的代码中 html  声明去掉,然后加上这段代码:<%@ page language=& ...

  10. webstorm怎样查找历史记录

    在webstorm中 文件界面右键,local History --> show History 上面能看到具体的日期和编写的代码. 如果想回到某一次的代码.把中间的代码按>>移入到 ...