poj 3268 单向最短路,来回路程~

原创 2016年05月31日 20:44:19
Silver Cow Party
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 17432   Accepted: 7993

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 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: NM, and X 
Lines 2..M+1: Line i+1 describes road i with three space-separated integers: AiBi, 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


题目大意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出

解题思路:最短路径只需要从x到i的最短路径代表他们返回的最短路径,然后将所有边反过来,再从x到i的最短路径代表他们来参加聚会的最短路径,这样对应相加找出一个最大值就可以了,当然其实不需要将所有边反过来,在dijkstra里面两次查询i到x最短路dis[i],和从x回到i的最短返回距离disf[i].
然后找出和的最大值即可~

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define N 1100
int n,m,x;
int dis[N],disf[N],maps[N][N],vis[N];

void init(int n)
{
    for(int i=0;i<=n;i++)
        for(int j=0;j<=n;j++)
           maps[i][j]=(i==j)?0:INF;
}

int dijkstra()
{
    int i,j,index,Min;
    for(i=1;i<=n;i++)
    {
        dis[i]=maps[i][x];  ///i到x的最短路~
        disf[i]=maps[x][i];  ///x返回i的最短路~
        vis[i]=0;
    }

    for(i=1;i<=n;i++)
    {
        Min=INF;
        for(j=1;j<=n;j++)
        {
            if(!vis[j] && Min>dis[j])
            {
                Min=dis[j];
                index=j;
            }
        }
        vis[index]=1;
        for(j=1;j<=n;j++)
        {
            if(!vis[j] && dis[j]>Min+maps[j][index])
                dis[j]=Min+maps[j][index];
        }
    }

    memset(vis,0,sizeof(vis));
    for(i=1;i<=n;i++)
    {
        Min=INF;
        for(j=1;j<=n;j++)
        {
            if(!vis[j] && Min>disf[j])
            {
                Min=disf[j];
                index=j;
            }
        }
        vis[index]=1;
        for(j=1;j<=n;j++)
        {
            if(!vis[j] && disf[j]>Min+maps[index][j])
                disf[j]=Min+maps[index][j];
        }
    }

    int Max=-1;
    for(i=1;i<=n;i++)
    {
        if(Max<dis[i]+disf[i])
            Max=dis[i]+disf[i];
    }
    return Max;
}

int main()
{
    int i,a,b,c,ans;
    while(scanf("%d%d%d",&n,&m,&x)!=EOF)
    {
        init(n);
        for(i=0;i<m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            maps[a][b]=c;
        }
        ans=dijkstra();
        printf("%d\n",ans);
    }
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

POJ3268 牛的最长来回时间(单源最短路径)

有编号为1-N的牛,它们之间存在一些单向的路径。给定一头牛的编号,其他牛要去拜访它并且拜访完之后要返回自己原来的位置,求这些牛中所花的最长的来回时间是多少。 每头牛返回的最短时间很简单就可以算出来,...

poj3268 - Silver Cow Party

想看更多的解题报告: http://blog.csdn.net/wangjian8006/article/details/7870410                              ...

POJ3268基本的Dijkstra

Source Code Problem: 3268   User: yanhc Memory: 8060K   Time: 63MS Language: C   Result: Ac...

HDU1535/POJ1511 - Invitation Cards - 有向图来回最短路

1.题目描述: Invitation Cards Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 ...

POJ 3268 Silver Cow Party 最短路

题意:n只牛在第x只牛家聚会...然后每只牛都走最短路,问所有牛到聚会现场以及回家用时最长的是多少... 有向图...最短路算法都是求单源最短路径...但是一来一回两次,可以先求一次以x为源点的,就...

【POJ3268】Silver Cow Party 最短路

题意:一堆奶牛去某个地方,去了又回,然后求去回和的最大值。 题解:两遍最短路,结束,邻接矩阵存边可以避免建反图。 #include #include #include #define N ...
  • Vmurder
  • Vmurder
  • 2014年11月03日 10:14
  • 775

poj3268 spfa 最短路

题目链接:点击打开链接 题意: 给定一个有向图; 问每头牛到固定地点聚会的花费加上回家的花费之和最大的花费是多少; 其中去和回都是最小的花费; 理解: 此题看上去可以先算回...

POJ - 3268 Silver Cow Party (往返最短路,Floyd,Dijkstra 2次优化)

直接Floyd:TLE #define _CRT_SECURE_NO_WARNINGS #include #include #include using namespace std; int...

POJ - 3268 单源最短路

题意:给定一些有向边,以及一个目的地,从某个点到达目的地,再从目的地回到那个点。共有n个点,问这n个点花费最大是多少?            思路:从目的地回去直接把目的地作为源点即可。那么从某个点...

POJ3268 Silver Cow Party spfa求解 最短路

题意:有N个点M条边,农场间由M条有向路径连接。每头牛来回都走最短的路,求这些牛中来回的最大时间? 分析:做两次spfa,一次以X为源点到每头牛,再一次从每头牛到X,求出每头牛来回的最大时间即使答案...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:poj 3268 单向最短路,来回路程~
举报原因:
原因补充:

(最多只允许输入30个字)