POJ 3268 Silver Cow Party (来回最短路 SPFA)

原创 2015年07月07日 10:59:30

Silver Cow Party
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 14384   Accepted: 6490

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 ofM (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; roadi requiresTi (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, andX
Lines 2..M+1: Line i+1 describes road i with three space-separated integers:Ai,Bi, andTi. The described road runs from farmAi to farmBi, requiringTi 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


题目链接:http://poj.org/problem?id=3268


题目大意:奶牛聚会,求所有奶牛从自己农场到目标农场再回到自己农场的最短路中的最大值,路是单向的


题目分析:与POJ 1511类似,从自己到目标农场进行n-1次SPFA,记录每个dis[x],然后一次SPFA(x),记录每个dis[i],最后两个值加起来取大即可,复杂度O(nm)感觉过不了,可是300ms+过了


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int const INF = 0x3fffffff;
int const MAX = 1005;
int dis[MAX], re1[MAX], re2[MAX];
bool vis[MAX];
int n, m, x;

struct EGDE
{
    int u, v, t;
}e[MAX * MAX / 2];

struct NODE
{
    int v, t;
    NODE(int vv, int tt)
    {
        v = vv;
        t = tt;
    }
};

vector <NODE> vt[MAX];

void SPFA(int v0)
{
    for(int i = 1; i <= n; i++)
        dis[i] = INF;
    dis[v0] = 0;
    queue <int> q;
    q.push(v0);
    memset(vis, false, sizeof(vis));
    while(!q.empty())
    {
        int u = q.front();
        q.pop();
        vis[u] = false;
        int sz = vt[u].size();
        for(int i = 0; i < sz; i++)
        {
            int v = vt[u][i].v;
            int t = vt[u][i].t;
            if(dis[v] > dis[u] + t)
            {
                dis[v] = dis[u] + t;
                if(!vis[v])
                {
                    vis[v] = true;
                    q.push(v);
                }
            }
        }
    }
    return;
}

int main()
{
    for(int i = 0; i <= n; i++)
        vt[i].clear();
    scanf("%d %d %d", &n, &m, &x);
    for(int i = 0; i < m; i++)
        scanf("%d %d %d", &e[i].u, &e[i].v, &e[i].t);
    for(int i = 0; i < m; i++)
        vt[e[i].u].push_back(NODE(e[i].v, e[i].t));
    for(int i = 1; i <= n; i++)
    {
        if(i == x)
        {
            continue;
            re1[i] = 0;
        }
        SPFA(i);
        re1[i] = dis[x];
    }
    SPFA(x);
    for(int i = 1; i <= n; i++)
        re2[i] = dis[i];
    int ans = 0;
    for(int i = 1; i <= n; i++)
        ans = max(ans, re1[i] + re2[i]);
    printf("%d\n", ans);
}



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

相关文章推荐

【求一个点到各个点的来回花费和】POJ - 3268 Silver Cow Party

Problem Description 输入n,m,x代表n个城市,m条单向道路,求x点到各个点的回来花费和,中的最大和。接下来输入m条道路,每行u,v,w分别代表城市u,到城市v,需要花费w。 ...

POJ3268 Silver Cow Party(dijkstra,spfa)

题目: Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 20481 ...

POJ - 3268 Silver Cow Party(spfa)

One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1..N is going to attend the big co...

POJ--3268--Silver Cow Party【SPFA+邻接表】

题意:一些牛要去某一点参加聚会,然后再回到自己家,路是单向的,问花费时间最多的那头牛最少需要花费多长时间。 思路:从聚会地点返回,相当于是从某一点到其他各个点的最短路径。从牛的家中走到聚会地...
  • zzzz40
  • zzzz40
  • 2014年07月31日 22:04
  • 701

POJ3268 Silver Cow Party spfa求解 最短路

题意:有N个点M条边,农场间由M条有向路径连接。每头牛来回都走最短的路,求这些牛中来回的最大时间? 分析:做两次spfa,一次以X为源点到每头牛,再一次从每头牛到X,求出每头牛来回的最大时间即使答案...

SPFA POJ 3268 Silver Cow Party

题目链接:http://poj.org/problem?id=3268 题目大意:有n个位置,m条路,求所有点到某一固定点x往返时间的最大值(有向),从i位置到j位置所需要用的时间 算法:...
  • zssee33
  • zssee33
  • 2012年09月05日 20:32
  • 295

Silver Cow Party--poj3268(SPFA)

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15533   Accepted...
  • nvliba
  • nvliba
  • 2015年08月20日 11:14
  • 546

poj 3268 Silver Cow Party Dijkstra 和SPFA

一开始做这个题目,很快写完,结果超时,我傻了,居然是n的3次方。。后来无语教我简化了,过了。。。 Silver Cow Party Time Limit: 2000MS   Memory ...

Poj 3268 Silver Cow Party【SPFA】

Silver Cow Party Time Limit: 2000MS   Memory Limit: 65536K Total Submiss...

poj3268 Silver Cow Party(SPFA)

题目请戳这里 题目大意:n个点,m条边的有向图,给定一个点x,现在要求所有点出发到x再回到各自的点的总路程的最大值。 题目分析:有向图,求来回距离和的最大值。我们可以将这段路程分成2部分:先走到x...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 3268 Silver Cow Party (来回最短路 SPFA)
举报原因:
原因补充:

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