usaco Controlling Companies

来源:互联网 发布:易通网络上网卡 编辑:程序博客网 时间:2024/05/29 14:24
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 wuLANG:C++TASK:concom*/#include<bits/stdc++.h>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<n;i++){cin>>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<<i<<" "<<j<<endl;}}


0 0
原创粉丝点击