zoukankan      html  css  js  c++  java
  • POj3268 Silver Cow Party

    http://poj.org/problem?id=3268

    题目大意:求到x距离与从x返回和的最大值

    从x点到各个点最短路好求,直接用Dijkstar,但从各个点到x点却不好求,只要把路向翻转过来也变成求从x点到各个点,直接用Dijstar

    dist[]记录x点到各个点的最短路径距离

    #include<stdio.h>
    #include<stdlib.h>
    #include<math.h>
    #include<string.h>
    #define max(a, b)(a > b ? a : b)
    #define min(a, b)(a < b ? a : b)
    #define INF 0xffffff
    #define N 1010
    
    int G1[N][N], G2[N][N];
    bool vis[N];
    int dist1[N], dist2[N], n;
    
    void Init()
    {
        int i, j;
        memset(vis, false, sizeof(vis));
        for(i = 1 ; i <= n ; i++)
        {
            dist1[i] = INF;
            dist2[i] = INF;
            for(j = 1 ; j <= n ; j++)
               {
                   G1[i][j] = INF;
                   G2[i][j] = INF;
               }
        }
    }
    
    void Dij(int G[][N], int dist[], int x)
    {
        int index, Min, i, j;
        for(i = 1 ; i <= n ; i++)
            dist[i] = INF;
        dist[x] = 0;
        for(i = 1 ; i <= n ; i++)
        {
            index = 0;
            Min = INF;
            for(j = 1 ; j <= n ; j++)
            {
                if(!vis[j] && dist[j] < Min)
                {
                    Min = dist[j];
                    index = j;
                }
            }
            vis[index] = true;
            for(j = 1 ; j <= n ; j++)
            {
                if(!vis[j] && dist[j] > dist[index] + G[index][j])
                    dist[j] = dist[index] + G[index][j];
            }
        }
    }
    
    int main()
    {
        int m, x, i, a, b, t, Max;
        while(scanf("%d%d%d", &n, &m, &x) != EOF)
        {
            Init();
            for(i = 1 ; i <= m ; i++)
            {
                scanf("%d%d%d", &a, &b, &t);
                G1[a][b] = t;
                G2[b][a] = t;
            }
           Dij(G1, dist1, x);
           memset(vis, false, sizeof(vis));
           Dij(G2, dist2, x);
           Max = 0;
           for(i = 1 ; i <= n ; i++)
               Max = max(Max, dist1[i] + dist2[i]);
            printf("%d
    ", Max);
        }
        return 0;
    }
  • 相关阅读:
    POJ 1981 最大点覆盖问题(极角排序)
    POJ 1286 Pólya定理
    POJ 1830 高斯消元
    HDU 3364 高斯消元
    Educational Codeforces Round 42D. Merge Equals(STL)
    ZOJ 3955:Saddle Point(思维)
    POJ 3301:Texas Trip(计算几何+三分)
    SCUT 125 :笔芯回文(DP)
    ZOJ 3953:Intervals(优先队列+思维)
    Codeforces Gym101097I:Sticks (思维)
  • 原文地址:https://www.cnblogs.com/qq2424260747/p/4662026.html
Copyright © 2011-2022 走看看