码迷,mamicode.com
首页 > 其他好文 > 详细

usaco Controlling Companies

时间:2015-09-05 13:47:43      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

 题意是,一个公司A要想可以控制另外一个公司B,必须满足一下三个条件之一

1.A等于B。也就是自己控制自己。

2.A拥有B的超过百分之50的股份。

3.A控制的所有公司拥有B的股份和超过百分之50.

 求输出所有公司之间的控制关系。不输出自己控制自己的情况。

看见求任意两点之间的控制关系,先想到了Floyd,但是好像用不了,后来就直接按着题意写了一下,wa了之后,发现公司的间接控制关系可以继续拓展。然后改了一下。

 我给出的算法类似于bellman-ford,通过变量m控制每次间接通过新增的点数来拓展。

比如,有

1 2 51

1 3 51

1 4 51

2 5 11

3 5 20

4 5 20

5 7 51

 第一遍发现了点1通过间接控制可控制5,那么在m增大之后,再做一遍就会通过5号点扩展到7,也就是公司1控制公司7

还见到有人写了思想类似于spfa的算法,这是某位大神的链接http://www.cnblogs.com/ACShiryu/archive/2011/07/18/2109336.html

因为数据范围小,所以我的这种没优化的算法也过了(其实是优化了空间了的,类似于bellman-ford基于dp思想的空间优化)

/*
ID: modengd1
PROG: concom
LANG: C++
*/
#include <iostream>
#include <stdio.h>
#include <memory.h>

using namespace std;
int A[100][100];
bool C[100][100];
int main()
{
    freopen("concom.in","r",stdin);
    freopen("concom.out","w",stdout);
    memset(C,false,sizeof(C));
    memset(A,0,sizeof(A));
    int N,a,b,p;
    scanf("%d",&N);
    for(int i=0;i<N;i++)
    {
        scanf("%d%d%d",&a,&b,&p);
        A[a-1][b-1]=p;
        if(A[a-1][b-1]>50)
            C[a-1][b-1]=true;
    }
    for(int m=0;m<100;m++)
    for(int i=0;i<100;i++)
    {
        C[i][i]=true;
        for(int j=0;j<100;j++)
        {
            int sum=0;
            if(!C[i][j])
            {
                for(int k=0;k<100;k++)
                {
                    if(C[i][k])
                        sum+=A[k][j];
                }
                if(sum>50)
                    C[i][j]=true;
            }
        }
    }
    for(int i=0;i<100;i++)
    {
        for(int j=0;j<100;j++)
        {
            if(C[i][j]&&i!=j)
            {
                cout<<i+1<<‘ ‘<<j+1<<endl;
            }
        }
    }
    return 0;
}

  

usaco Controlling Companies

标签:

原文地址:http://www.cnblogs.com/modengdubai/p/4783092.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!