【Dijkstra算法】Roadblocks

Time Limit: 2000MS   Memory Limit: 65536K
     

Description

Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the shortest path. She knows there must be some second-shortest path.

The countryside consists of R (1 ≤ R ≤ 100,000) bidirectional roads, each linking two of the N (1 ≤ N ≤ 5000) intersections, conveniently numbered 1..N. Bessie starts at intersection 1, and her friend (the destination) is at intersection N.

The second-shortest path may share roads with any of the shortest paths, and it may backtrack i.e., use the same road or intersection more than once. The second-shortest path is the shortest path whose length is longer than the shortest path(s) (i.e., if two or more shortest paths exist, the second-shortest path is the one whose length is longer than those but no longer than any other path).

Input

Line 1: Two space-separated integers: N and R
Lines 2..R+1: Each line contains three space-separated integers: A, B, and D that describe a road that connects intersections A and B and has length D (1 ≤ D ≤ 5000)

Output

Line 1: The length of the second shortest path between node 1 and node N

Sample Input

4 4
1 2 100
2 4 200
2 3 250
3 4 100

Sample Output

450

Hint

Two routes: 1 -> 2 -> 4 (length 100+200=300) and 1 -> 2 -> 3 -> 4 (length 100+250+100=450)

OJ:POJ

题目大意

某街区共有R条道路、N个路口。道路可以双向通行。问1号路口到N号路口的次短路长度是多少?次短路指的是比最短路长度长的次短的路径。同一条边可以经过多次。(摘自《挑战程序设计 第二版》)

分析

用Dijkstra算法来求,单源最短路问题,到某个顶点v的次短路要么是①到其他某个顶点u的最短路再加上u->v的边,要么是到u的次短路再加上u->v的边。

参考代码

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

using namespace std;

const int MAX_V=5001;
const int INF=1e9;

struct edge{
int to;//边的出点
int cost;//权值
};

vector<edge> G[MAX_V];//邻接表

typedef pair<int,int> P;//first是源点到该点的距离,second是当前顶点

int dist1[MAX_V];//存最短距离
int dist2[MAX_V];//存次短距离
int N,R;//N个路口,R条道路
void dijkstra();
int main()
{

    int s,w,t;
    edge e;
    scanf("%d%d",&N,&R);
    for(int i=0;i<R;i++){
    scanf("%d%d%d",&s,&t,&w);
    e.to=t-1;
    e.cost=w;
    G[s-1].push_back(e);
    e.to=s-1;
    G[t-1].push_back(e);
    }
    dijkstra();
    printf("%d\n",dist2[N-1]);
    return 0;
}

void dijkstra(){
    priority_queue <P,vector<P>,greater<P> >que;
    fill(dist1,dist1+N,INF);
    fill(dist2,dist2+N,INF);
    dist1[0]=0;
    que.push(P(0,0));
    while(!que.empty()){
        P p=que.top();
        que.pop();
        int v=p.second;//新的源点
        int d=p.first;
        /*如果旧源点到新源点的距离比旧源点到新源点的距离大,
        那么不用执行下面的代码去更新新源点到其他各点的dist1,dist2
        因为它算出来的距离肯定比以前算出来的大。
        */
        if(d>dist2[v])
            continue;
        for(int i=0;i<G[v].size();i++){
            edge& e=G[v][i];
            int d2=d+e.cost;
            if(dist1[e.to]>d2){///最短距离
                swap(d2,dist1[e.to]);
                que.push(P(dist1[e.to], e.to));
            }
            /*
            d2大于源点到e.to的最短距离,小于以前计算的次短距离则更新
            */
            if(d2>dist1[e.to]&&d2<dist2[e.to]){///次短距离
                dist2[e.to]=d2;
                que.push(P(dist2[e.to],e.to));
            }
        }

    }

}

参考自http://blog.csdn.net/gemire/article/details/20832199

时间: 2024-11-04 20:55:29

【Dijkstra算法】Roadblocks的相关文章

POJ 3255 Roadblocks (次短路径 + Dijkstra算法)

Roadblocks Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7982   Accepted: 2921 Description Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too q

畅通project续HDU杭电1874【dijkstra算法 || SPFA】

http://acm.hdu.edu.cn/showproblem.php?pid=1874 Problem Description 某省自从实行了非常多年的畅通project计划后.最终修建了非常多路.只是路多了也不好,每次要从一个城镇到还有一个城镇时,都有很多种道路方案能够选择,而某些方案要比还有一些方案行走的距离要短非常多.这让行人非常困扰. 如今,已知起点和终点,请你计算出要从起点到终点.最短须要行走多少距离. Input 本题目包括多组数据.请处理到文件结束. 每组数据第一行包括两个正

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

ACM: HDU 3790 最短路径问题-Dijkstra算法

HDU 3790 最短路径问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Input 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是

邻接表实现Dijkstra算法以及DFS与BFS算法

//============================================================================ // Name : ListDijkstra.cpp // Author : fffff // Version : // Copyright : Your copyright notice // Description : Hello World in C++, Ansi-style //==========================

Dijkstra算法(求解单源最短路)详解 + 变形 之 poj 1860 Currency Exchange

/* 求解单源最短路问题:Dijkstra算法(该图所有边的权值非负) 关键(贪心): (1)找到最短距离已经确定的节点,从它出发更新与其相邻节点的最短距离: (2)此后不再关心(1)中“最短距离已经确定的节点”. 时间复杂度(大概的分析,不准确): “找到最短距离已经确定的节点” => O(|V|) "从它出发更新与其相邻节点的最短距离" => 邻接矩阵:O(|V|),邻接表:O(|E|) 需要循环以上两个步骤V次,所以时间复杂度:O(V^2) 即:在|E|较小的情况下,

Dijkstra 算法

最短路径算法的基础知识,参见 http://blog.csdn.net/pacosonswjtu/article/details/49894021 Dijkstra算法 涉及到的 优先队列的操作实现(该优先队列的数据类型不是 int , 而是 Distance),详情参见http://blog.csdn.net/pacosonswjtu/article/details/49923389 [1]Dijkstra 算法相关 1.1)贪婪算法一般分阶段去求解一个问题, 在每个阶段它都把当前出现的当做是

51nod-迷宫问题(Dijkstra算法)

Dijkstra算法 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数.还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间.游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大.现在问题来了,给定房间.道路.分数.起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么? Dijkstra算法是一个经典的算法--他是荷兰计算机科学家D

Dijkstra算法

Dijkstra算法是一个经典的算法--他是荷兰计算机科学家Dijkstra于1959年提出的单源图最短路径算法.也是一个经典的贪心算法.所谓单源图 是规定一个起点的图,我们的最短路径都是从这个起点出发计算的.算法的适用范围是一个无向(或者有向图),全部边权都是非负数. 算法描写叙述: 节点集合V = {}空集合,距离初始化. 节点编号0..n – 1, 起点编号0≤ s < n. 距离数组 起点 d[s] = 0 其它 d[i] = ∞, 0 ≤ i < n,  i ≠ s. 循环n次 找到