zoukankan      html  css  js  c++  java
  • Stockbroker Grapevine(投资经纪人)

    poj1125

    题目大意:哎,本题读题就读了三遍才搞懂输入的究竟是什么东西,其实只要理解input和output就行了

    input是这样的,第一行输出经济人的个数,并且编号为1....n, 接下来n行每行第一个数为与n联系的人的个数m,接下来有m对,没对第一个表示与n联系的人的编号,第二个数表示两人取得联系的时间,t

    output是这样的,输出从哪个人发出信息取得的总时间最短,并求出这个从该人向其他人发出信息最长时间

    解决:floyd算法求出各个点到其他点的最短时间,,并查集判断是否是连通的 ,代码比较简单就不加注释了

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    using namespace std;
    const int N= 105;
    const int MAX=0xf3f3f3f;
    
    int num[N];
    bool mark[N];
    
    int cost[N][N];
    int mx[N];
    int n;
    void initNum()
    {
        memset(num,-1,sizeof(num));
        memset(mark,0,sizeof(mark));
    }
    
    void init()
    {
        for(int i=1;i<=n;i++)
          for(int j=1;j<=n;j++)
          if(i==j)cost[i][j]=0;
          else cost[i][j]=MAX;
    }
    int  find(int x)
    {
        if(num[x]<0)return x;
        else return num[x]=find(num[x]);
    }
    void merge(int a,int b)
    {
        int fa=find(a);
        int fb=find(b);
        if(fa==fb)return ;
        int t=num[fa]+num[fb];
        if(num[fa]>num[fb]){num[fa]=fb;num[fb]=t;}
        else {num[fb]=fa;num[fa]=t;}
    }
    
    
    void floyd()
    {
        int i,j,k;
        for(k=1;k<=n;k++)
          for(i=1;i<=n;i++)
            for(j=1;j<=n;j++)
            if(cost[i][k] + cost[k][j] < cost[i][j])
            cost[i][j]=cost[i][k]+cost[k][j];
         int min=0x7fffffff,sum,pos=-1;   
         memset(mx,-1,sizeof(mx));
         for(i=1;i<=n;i++)
         {
            sum=0;   
            for(j=1;j<=n;j++)
            {
                sum+=cost[i][j];
                if(cost[i][j]!=MAX && cost[i][j]>mx[i])mx[i]=cost[i][j];
            }
            if(sum<min){min=sum;pos=i;}
          }
         printf("%d %d\n",pos,mx[pos]);      
    }
    int main()
    {
       while( scanf("%d",&n),n)
       {
            init();
            initNum();
            int i,m,adj,w;
            for(i=1;i<=n;i++)
            {
                mark[i]=1;
               scanf("%d",&m);
               while(m--)
               {
                    scanf("%d%d",&adj,&w);
                    if(i!=adj){merge(i,adj);mark[adj]=1;}
                    cost[i][adj]=w;
               }
            }
            int cnt=0;
            for(i=1;i<=n && cnt!=2;i++)
             if(mark[i] && num[i]<0)cnt++;
           if(cnt==2)printf("disjoint\n");
           else
            floyd();
       }
       system("pause");
        return 0;
    }
    

  • 相关阅读:
    C++ Primer 第五版-1.1
    C++ Primer 第五版笔记-1.0
    TouchID
    正则表达式
    duplicate symbol 错误
    第三方登录
    AFNetWorking
    IOS---通知
    左右点击--日期增减
    Xcode相关设置
  • 原文地址:https://www.cnblogs.com/hpustudent/p/2138011.html
Copyright © 2011-2022 走看看