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

1726: [Usaco2006 Nov]Roadblocks第二短路

Description

贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友。贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路。 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个。贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地)。 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多次。当然咯,第二短路的长度必须严格大于最短路(可能有多条)的长度,但它的长度必须不大于所有除最短路外的路径的长度。

刷水有利于健康。

话说这还是前天考试的T3嘞。。。

code:

#include <iostream>
#include <cstdio>
#include <queue>

using namespace std;

const int wx=200017;

inline int read(){
    int sum=0,f=1; char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
    return sum*f;
}

int n,m,num,tot;
int head[wx],diss[wx],dist[wx],vis[wx];

struct e{
    int nxt,to,dis;
}edge[wx*2];

void add(int from,int to,int dis){
    edge[++num].nxt=head[from];
    edge[num].to=to;
    edge[num].dis=dis;
    head[from]=num;
}

struct node{
    int u,d;
    friend bool operator < (const node & a,const node &b){
        return a.d>b.d;
    }
};

priority_queue<node >q;
void Dijs(){
    for(int i=1;i<=n;i++)diss[i]=0x3f3f3f3f,vis[i]=0;
    diss[1]=0; q.push((node){1,0});
    while(q.size()){
        int u=q.top().u; q.pop();
        if(vis[u])continue; vis[u]=1;
        for(int i=head[u];i;i=edge[i].nxt){
            int v=edge[i].to;
            if(diss[v]>diss[u]+edge[i].dis){
                diss[v]=diss[u]+edge[i].dis;
                q.push((node){v,diss[v]});
            }
        }
    }
}

void Dijt(){
    for(int i=1;i<=n;i++)dist[i]=0x3f3f3f3f,vis[i]=0;
    dist[n]=0; q.push((node){n,0});
    while(q.size()){
        int u=q.top().u; q.pop();
        if(vis[u])continue; vis[u]=1;
        for(int i=head[u];i;i=edge[i].nxt){
            int v=edge[i].to;
            if(dist[v]>dist[u]+edge[i].dis){
                dist[v]=dist[u]+edge[i].dis;
                q.push((node){v,dist[v]});
            }
        }
    }
}

void work(){
    int tmp=0x3f3f3f3f;
    int minn=diss[n];
    for(int u=1;u<=n;u++){
        for(int i=head[u];i;i=edge[i].nxt){
            int v=edge[i].to;
            int now=diss[u]+dist[v]+edge[i].dis;
            if(now<tmp&&now>minn){
                tmp=now;
            }
        }
    }
    printf("%d\n",tmp);
}

int main(){
    n=read(); m=read();
    for(int i=1;i<=m;i++){
        int x,y,z;
        x=read(); y=read(); z=read();
        add(x,y,z); add(y,x,z);
    }
    Dijs();
    Dijt();
    work();
    return 0;
}

原文地址:https://www.cnblogs.com/wangxiaodai/p/9816333.html

时间: 2024-08-04 18:57:48

最短路【bzoj1726】: [Usaco2006 Nov]Roadblocks第二短路的相关文章

bzoj1726 [Usaco2006 Nov]Roadblocks第二短路

1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 826  Solved: 394[Submit][Status] Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向

1726: [Usaco2006 Nov]Roadblocks第二短路

1726: [Usaco2006 Nov]Roadblocks第二短路 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 835  Solved: 398[Submit][Status] Description 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向

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

从起点和终点各跑一次最短路 , 然后枚举每一条边 , 更新answer ----------------------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue&g

[SPFA][jzyzoj1220]第二短路

题面就不给了= =就是求从1到n的第二短路 因为从1到1的路径还要再求一次,所以不能用dijkstra的方法进行松弛,这时候需要我们使用spfa 以下是策略: 1.当前求得最短路小于已知最短路时,先将第二短路进行更新(需要将新的第二短路和旧的最短路进行比较),再将第一短路进行更新: 2.当前求得最短路等于已知最短路时,将第二短路进行更新(需要将新的第二短路与旧的第二短路进行比较): 3.当前求得最短路大于已知最短路时,将第二短路进行更新(将求得最短路与第二短路进行比较): 其余部分就是SPFA的

POJ 3255 Roadblocks (次短路问题)

解法有很多奇葩的地方,比如可以到达终点再跳回去再跳回来(比如有两个点)....反正就是不能有最短路,不过没关系,算法都能给出正确结果 思想:和求最短路上的点套路一样,spfa先正着求一次,再反着求一次最短路,然后枚举每条边<i,j>找dist_zheng[i] + len<i,j> + dist_fan[j]的第二小值即可!注意不能用邻接矩阵,那样会MLE,应该用邻接表 /* poj 3255 3808K 266MS */ #include<cstdio> #inclu

【最短路】LightOJ 1099 - Not the Best 第二短路

点击打开链接 题意:求第二短路,题目定义:一定要大于最短路      并且路可以重复走: 开二维数组 d[N][2] 分别记录最短路和第二短路 #include <cstdio> #include <cstring> #include <cstdlib> #include <string> #include <iostream> #include <algorithm> #include <sstream> #includ

POJ3255:Roadblocks(次短路 SPFA+A星)

给出1-N 个点 的距离, 求从1号到N号的次短路, 直接用k短路来做了,,dj会TLE, 用spfa就过了 题目: I - RoadblocksTime Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Description Bessie has moved to a small farm and sometimes enjoys returning to visit o

第二短路

oj1220 贝茜把家搬到了一个小农场,但她常常回到FJ的农场去拜访她的朋友.贝茜很喜欢路边的风景,不想那么快地结束她的旅途,于是她每次回农场,都会选择第二短的路径,而不象我们所习惯的那样,选择最短路. 贝茜所在的乡村有R(1<=R<=100,000)条双向道路,每条路都联结了所有的N(1<=N<=5000)个农场中的某两个.贝茜居住在农场1,她的朋友们居住在农场N(即贝茜每次旅行的目的地). 贝茜选择的第二短的路径中,可以包含任何一条在最短路中出现的道路,并且,一条路可以重复走多

poj - 3225 Roadblocks(次短路)

http://poj.org/problem?id=3255 bessie 有时会去拜访她的朋友,但是她不想走最快回家的那条路,而是想走一条比最短的路长的次短路. 城镇由R条双向路组成,有N个路口.标号为1到N,问1号路口到N号路口的次短路长度是多少?次短路是 比最短路长度长的次短的路径.同一条边可以经过多次. 到某个顶点v的次短路要么帅到其他顶点u的最短路在加上u-v的边,要么是到u的次短路再加上u-v的边, 因此所需要求的就是到所有顶点的最短路和次短路,因此,对于每个顶点,我们记录的不仅仅是