usaco Controlling Companies

Controlling Companies 控制公司
有些公司是其他公司的部分拥有者,因为他们获得了其他公司发行的股票的一部分.例如,福特公司
拥有马自达公司 12%的股票.据说,如果至少满足了以下条件之一,公司 A 就可以控制公司 B 了:
公司 A = 公司 B.
公司 A 拥有大于 50%的公司 B 的股票.
公司A控制K(K >= 1)个公司,记为C1, ..., CK,每个公司Ci拥有xi%的公司B的股票,并且x1+ ....
+ xK > 50%.
你将被给予一系列的三对数(i,j,p),表明公司 i 享有公司 j 的 p%的股票.计算所有的数对(h,s),
表明公司 h 控制公司 s.至多有 100 个公司.
写一个程序读入三对数(i,j,p),i,j和p是都在范围(1..100)的正整数,并且找出所有的数对(h,s),
使得公司 h 控制公司 s.
PROGRAM NAME: concom
INPUT FORMAT
第一行: N,表明接下来三对数的数量.
第二行到第 N+1 行: 每行三个整数作为一个三对数(i,j,p),如上文所述.
SAMPLE INPUT (file concom.in)
3
1 2 80
2 3 80
3 1 20
OUTPUT FORMAT
输出零个或更多个的控制其他公司的公司.每行包括两个整数表明序号为第一个整数的公司控制了
序号为第二个整数的公司.将输出的每行以第一个数字升序排列(并且第二个数字也升序排列来避
免并列).请不要输出控制自己的公司.
SAMPLE OUTPUT (file concom.out)
1 2
1 3

2 3


看得懂题解但自己写不出来思路不够清晰

/*
ID:jinbo wu
LANG:C++
TASK:concom
*/
#include
using namespace std;
int a[105][105];
int b[105][105];
int n,maxn;
void dfs(int i,int j)
{
  for(int k=1;k<=maxn;k++)
  {
  	if(k!=i&&b[i][k]<=50)
  	{
	 b[i][k]+=a[j][k];
  	 if(b[i][k]>50)
  	 dfs(i,k);
    }
  }
	
}
int main()
{
	freopen("concom.in","r",stdin);
	freopen("concom.out","w",stdout);
	cin>>n;
	int x,y,z;
	for(int i=0;i>x>>y>>z;
		a[x][y]=z;
		maxn=max(maxn,max(x,y));
	}
memcpy(b,a,sizeof(a));
for(int i=1;i<=maxn;i++)
{
	for(int j=1;j<=maxn;j++)
	{
	  if(i!=j&&a[i][j]>50)
      dfs(i,j);
    }
}
for(int i=1;i<=maxn;i++)
for(int j=1;j<=maxn;j++)
{
	if(i!=j&&b[i][j]>50)
	cout<


你可能感兴趣的:(usaco)