POJ-3268-Silver Cow Party

链接:https://vjudge.net/problem/POJ-3268

题意:

1-N个农村要在X位置举办Party。求N个农村过去个回来的最大值。

给一个带权有向图,N个结点,M条路径。和点X。

思路:

第一次用Floyd算法O(N^3)超时了。

然后用两个二维数组,记录原数组和原数组的反方向。

例如,原数组Map1[x][1]记录的是x->1即从x回来的路程,Map2[x][1]记录的是1->x过去的路程。

代码:

#include <iostream>
#include <memory.h>
using namespace std;
const int MAXN = 1000+10;
const int INF = 99999999;
int Map1[MAXN][MAXN];//回来
int Map2[MAXN][MAXN];//过去
int Dis1[MAXN];
int Dis2[MAXN];
int vis[MAXN];
int n,m,x;

void Dijkstra(int Map[MAXN][MAXN],int Dis[MAXN])
{
    memset(vis,0, sizeof(vis));
    for (int i = 1;i <= n;i++)
        Dis[i] = Map[x][i];
    vis[x] = 1;
    for (int i = 1;i <= n;i++)
    {
        int w,small = INF;
        for (int j = 1;j <= n;j++)
        {
            if (vis[j] == 0)
            {
                if (Dis[j] < small)
                {
                    small = Dis[j];
                    w = j;
                }
            }
        }
        vis[w] = 1;
        for (int j = 1;j <= n;j++)
        {
            if (vis[j] == 0)
            {
                Dis[j] = min(Dis[j],Dis[w]+Map[w][j]);
            }
        }
    }
}

int main()
{
    int l,r,v;
    scanf("%d%d%d",&n,&m,&x);
    for (int i = 1;i<=n;i++)
        for (int j = 1;j<=n;j++)
            if (i == j)
                Map2[i][j] = Map1[i][j] = 0;
            else
                Map2[i][j] = Map1[i][j] = INF;

    for (int i = 0;i < m;i++)
    {
        scanf("%d%d%d",&l,&r,&v);
        Map1[l][r] = v;
        Map2[r][l] = v;
    }
    int sum = 0;
    Dijkstra(Map1,Dis1);
    Dijkstra(Map2,Dis2);
    for (int i = 1;i<=n;i++)
        sum = max(sum,Dis1[i]+Dis2[i]);

    printf("%d
",sum);


    return 0;
}

  

原文地址:https://www.cnblogs.com/YDDDD/p/10273839.html