poj1125 Stockbroker Grapevine

数据貌似很水的样子。用了N次Dijkstra来计算每点到其他各点距离的最大值,时间复杂度还是蛮大的,结果也是0ms。

英语不好伤不起啊,题目看了好久才知道在干嘛。

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
#define MAXD 110
#define INF 0x3f3f3f3f
using namespace std;
int N,data[MAXD][MAXD],d[MAXD];
bool graph[MAXD][MAXD];

class cmp
{
    public:
    bool operator()(int a,int b)
    {
        return d[a]>d[b];
    }
};

void Dijkstra(int src)
{
    priority_queue<int,vector<int>,cmp > que;
    bool vis[MAXD];
    memset(vis,0,sizeof(vis));
    memset(d,0x3f,sizeof(d));
    d[src]=0;
    que.push(src);
    int t;
    int i;
    while(!que.empty())
    {
        t=que.top();
        vis[t]=true;
        que.pop();
        for(i=1;i<=N;i++)
        {
            if(!vis[i]&&graph[t][i]&&d[i]>d[t]+data[t][i])
            {
                d[i]=d[t]+data[t][i];
                que.push(i);
            }
        }
    }
}

int max()
{
    int i,ans=0;
    for(i=1;i<=N;i++)
    {
        if(ans<d[i])
        ans=d[i];
    }
    return ans;
}
int main()
{
    //freopen("test.txt","r",stdin);
    while(scanf("%d",&N)!=EOF)
    {
        if(N==0)
        return 0;
        int i,j,m,t;
        memset(graph,0,sizeof(graph));
        for(i=1;i<=N;i++)
        {
            scanf("%d",&m);
            for(j=1;j<=m;j++)
            {
                scanf("%d",&t);
                scanf("%d",&data[i][t]);
                graph[i][t]=true;
            }
        }
        int flag=0,ans=INF;
        for(i=1;i<=N;i++)
        {
            Dijkstra(i);
            if(ans>max())
            {
                ans=max();
                flag=i;
            }
        }
        if(flag==0)
        printf("disjoint\n");
        else
        printf("%d %d\n",flag,ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/longlongagocsu/p/2831695.html