标签:
题意是,一个公司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;
}
标签:
原文地址:http://www.cnblogs.com/modengdubai/p/4783092.html