POJ-3268-最短路(dijkstra算法)

Silver Cow Party

Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 12494   Accepted: 5568

Description

One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤
XN). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; road
i requires Ti (1 ≤ Ti ≤ 100) units of time to traverse.

Each cow must walk to the party and, when the party is over, return to her farm. Each cow is lazy and thus picks an optimal route with the shortest time. A cow‘s return route might be different from her original route to the party since roads are one-way.

Of all the cows, what is the longest amount of time a cow must spend walking to the party and back?

Input

Line 1: Three space-separated integers, respectively:
N, M, and X

Lines 2..M+1: Line i+1 describes road i with three space-separated integers:
Ai, Bi, and Ti. The described road runs from farm
Ai to farm Bi, requiring Ti time units to traverse.

Output

Line 1: One integer: the maximum of time any one cow must walk.

Sample Input

4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3

Sample Output

10

Hint

Cow 4 proceeds directly to the party (3 units) and returns via farms 1 and 3 (7 units), for a total of 10 time units.

Source

USACO 2007 February Silver

题目的意思是:从出发点到达目的地X,再从X返回到出发点的最短路径中的最大值(因为出发点没有固定,也就是可以:1->X->1, 2->X->2等)。所以我们要枚举所有的可能性,找出其中的最大值。巧妙地运用dijkstra算法,双向求出两次X->m的最短路径长然后相加即得到了m->X->m的最短路径。代码如下:

#include<queue>
#include<vector>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct Edge
{
    int to;
    int dis;
    Edge(int to, int dis){
        this -> to = to;
        this -> dis = dis;
    }
};
typedef pair<int,int>P;

int a,b,c;
int N,M,X;
int d1[1005],d2[1005];
vector<Edge> G1[1005];
vector<Edge> G2[1005];
void dijkstra(int s,int d[],vector<Edge> G[])
{
    priority_queue<P,vector<P>,greater<P> >q;
    d[s]=0;
    q.push(P(0,s));
    while(q.size())
    {
        P p=q.top();
        q.pop();
        int v=p.second;
        for(int i=0;i<G[v].size();i++)
        {
            Edge& e=G[v][i];
            if(d[e.to]>d[v]+e.dis)
            {
                d[e.to]=d[v]+e.dis;
                q.push(P(d[e.to],e.to));
            }
        }
    }
}
int main()
{
    memset(d1,0x5f,sizeof(d1));
    memset(d2,0x5f,sizeof(d2));
    scanf("%d%d%d",&N,&M,&X);
    for(int i=1;i<=M;i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        G1[a].push_back(Edge(b,c));
        G2[b].push_back(Edge(a,c));
    }
    dijkstra(X,d1,G1);
    dijkstra(X,d2,G2);
    int small_max=-1;
    for(int i=1;i<=N;i++)
    {
        if(i==X) continue;
        small_max=max(small_max,d1[i]+d2[i]);
    }
    cout<<small_max<<endl;
}

POJ-3268-最短路(dijkstra算法),布布扣,bubuko.com

时间: 2024-10-27 01:08:48

POJ-3268-最短路(dijkstra算法)的相关文章

POJ 2387 最短路Dijkstra算法

Til the Cows Come Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33607   Accepted: 11383 Description Bessie is out in the field and wants to get back to the barn to get as much sleep as possible before Farmer John wakes her for the

poj 1135 最短路 dijkstra

传送门 http://poj.org/problem?id=1135 建模分两部分:1.如果最后是关键牌倒下,那么找最短路中最长的就行--最远的倒下,其他的牌一定倒下,所以找最远的最短路 2.如果最后是普通牌倒下,那么找三角形,三角形周长的一半就是倒下的位置 到底是情况1还是情况2,自己在脑子模拟一下就能想到,还是那句话,最难倒下的倒下了,其他的一定都倒下了,若第二种情况的时间比第一种长,那么就是第二种,反之,第一种 上代码 /**********************************

POJ 3268 Silver Cow Party 最短路—dijkstra算法的优化。

POJ 3268 Silver Cow Party Description One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects

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<

最短路 Dijkstra算法

Dijksitra算法求最短路仅仅适用于不存在右边是负权的情况(Bellman-Ford算法没有这一个限制).主要特点是从起点为中心向外层层扩展,直到扩展到终点为止. 最短路的最优子结构性质 即一个最短路路径中经过的所有点这条路均是其最短路.(反证法易证) Dijkstra基本思路: ①找到最短距离已经确定的顶点,从它出发更新相邻顶点的最短距离 ②此后不需要再关心1中的"最短距离已经确定的顶点" 在最开始的时候,只有起点的最短距离是确定的.而在尚未使用过的顶点中,距离d[i]最小的顶点

单源最短路Dijkstra算法——matlab实现

迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中顶点的路径是"起点s

hdu2544 最短路 Dijkstra算法

最短路(Dijkstra算法模板题) Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 96778    Accepted Submission(s): 41849借鉴链接:https://blog.csdn.net/UncleJokerly/article/details/79703622 Problem Description 在每年的

POJ 2253 Frogger (dijkstra算法 + 预处理)

Frogger Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 27020   Accepted: 8797 Description Freddy Frog is sitting on a stone in the middle of a lake. Suddenly he notices Fiona Frog who is sitting on another stone. He plans to visit her,

MPI Maelstrom POJ - 1502 最短路Dijkstra

BIT has recently taken delivery of their new supercomputer, a 32 processor Apollo Odyssey distributed shared memory machine with a hierarchical communication subsystem. Valentine McKee's research advisor, Jack Swigert, has asked her to benchmark the