zoukankan      html  css  js  c++  java
  • 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 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.
     
    题意:有n个牧场里面对应住着n只奶牛,现在在农场x举行一场聚会,所有奶牛都要去参加,并且参加完聚会后返回自己的牧场,路是单向的,那么求出:去参加聚会然后再回来所用时间最长的奶牛,输出这个时间。(当然奶牛也是知道要求出最短路径的,把最短路径的最大值输出就行了,由于路不是双向的,反向再进行一次spfa)
    #include<stdio.h>
    #include<string.h>
    #include<queue>
    #include<algorithm>
    using namespace std;
    
    const int N=1010;
    const int INF=0x3f3f3f3f;
    
    int G1[N][N], G2[N][N], d1[N], d2[N], vis[N], n, x;
    
    void Init()
    {
        int i, j;
    
        for (i = 1; i <= n; i++)
        {
            d1[i] = d2[i] = INF;
            for (j = 1; j <= n; j++)
                G1[i][j] = G2[i][j] = INF;
            G1[i][i] = G2[i][i] = 0;
        }
    }
    
    void Spfa(int G[][N], int d[])
    {
        int i, v;
        queue<int>Q;
    
        memset(vis, 0, sizeof(vis));
    
        Q.push(x);
        d[x] = 0;
    
        while (!Q.empty())
        {
            v = Q.front(); Q.pop();
    
            for (i = 1; i <= n; i++)
            {
                if (d[i] > d[v]+G[v][i])
                {
                    d[i] = d[v]+G[v][i];
    
                    if (!vis[i])
                    {
                        Q.push(i);
                        vis[i] = 1;
                    }
                }
            }
    
            vis[v] = 0;
        }
    }
    
    int main ()
    {
        int m, a, b, c, M, i;
    
        while (scanf("%d%d%d", &n, &m, &x) != EOF)
        {
            Init();
            M = -INF;
    
            while (m--)
            {
                scanf("%d%d%d", &a, &b, &c);
    
                G1[a][b] = min(G1[a][b], c);
                G2[b][a] = min(G2[b][a], c);
            }
    
            Spfa(G1, d1);
            Spfa(G2, d2);
    
            for (i = 1; i <= n; i++)
                M = max(M, d1[i]+d2[i]);
    
            printf("%d
    ", M);
        }
    
        return 0;
    }
  • 相关阅读:
    推荐一个golang的json库
    TinyMind 多标签图像分类竞赛 之路
    动态环境下的slam问题如何解决?
    ubuntu16.04下安装opencv3.4.1及其扩展模块
    Ubuntu 16.04 编译OpenCV 问题解决stdlib.h: No such file or directory
    linux下升级gcc版本(gcc-7)
    基于LSD的直线提取算法
    PL-SLAM
    用U盘制作并安装WIN10 64位原版系统的详细教程(该方法应该适用于任何一版的原版操作系统)
    Win10正式版U盘安装教程
  • 原文地址:https://www.cnblogs.com/syhandll/p/4810228.html
Copyright © 2011-2022 走看看