USACO Section 2.3 Controlling Companies

Controlling Companies

Some companies are partial owners of other companies because they have acquired part of their total shares of stock. For example, Ford owns 12% of Mazda. It is said that a company A controls company B if at least one of the following conditions is satisfied:

  • Company A = Company B
  • Company A owns more than 50% of Company B
  • Company A controls K (K >= 1) companies denoted C1, ..., CK with each company Ci owning xi% of company B and x1 + .... + xK > 50%.

Given a list of triples (i,j,p) which denote company i owning p% of company j, calculate all the pairs (h,s) in which company h controls company s. There are at most 100 companies.

Write a program to read the list of triples (i,j,p) where i, j and p are positive integers all in the range (1..100) and find all the pairs (h,s) so that company h controls company s.

PROGRAM NAME: concom

INPUT FORMAT

Line 1: n, the number of input triples to follow
Line 2..n+1: Three integers per line as a triple (i,j,p) described above.

SAMPLE INPUT (file concom.in)

3
1 2 80
2 3 80
3 1 20

OUTPUT FORMAT

List 0 or more companies that control other companies. Each line contains two integers that denote that the company whose number is the first integer controls the company whose number is the second integer. Order the lines in ascending order of the first integer (and ascending order of the second integer to break ties). Do not print that a company controls itself.

SAMPLE OUTPUT (file concom.out)

1 2
1 3
2 3
Analysis
This problem is a graph travelling problem. The DFS is needed. Here I provide the official analysis.

The method used here to solve the problem is as follows. We keep track of which companies control which other companies, and every time we hear that so and so owns this much percent of so and so, we update our information.
The array "owns" keeps track of how much of company j is owned by company i, whether directly or via controlled companies. The array "controls" keeps track of which companies are controlled by which other companies.

code

/*
ID:braytay1
PROG:concom
LANG:C++
*/

#include 
<iostream>
#include 
<fstream>
#include 
<string>
using namespace std;
ofstream fout(
"concom.out");
ifstream fin(
"concom.in");
int stock[101][101],cx[101],n;
bool con[101][101],vis[101];

void DFS(int com){
    
if (vis[com]) return;
    vis[com]
=true;
    
for (int i=1;i<=100;i++){
        cx[i]
+=stock[com][i];
        
if (cx[i]>50&&i!=com){            
            DFS(i);
        }

    }

}

int main(){
    fin
>>n;
    memset(stock,
0,sizeof(stock));
    
for (int k=1;k<=n;k++){
        
int i,j,p;
        fin
>>i>>j>>p;
        stock[i][j]
=p;
    }

    
for (int i=1;i<=100;i++) stock[i][i]=100;
    memset(cx,
0,sizeof(cx));
    memset(vis,
false,sizeof(vis));
    memset(con,
false,sizeof(con));
    
for(int i=1;i<=100;i++){
        DFS(i);
        
for(int j=1;j<=100;j++){
            
if (cx[j]>50) con[i][j]=true;
        }

        memset(cx,
0,sizeof(cx));
        memset(vis,
false,sizeof(vis));
    }

    
for(int i=1;i<=100;i++){
        
for(int j=1;j<=100;j++){
            
if (con[i][j]&&i!=j) fout<<i<<" "<<j<<endl;
        }

    }

    
return 0;
}

posted on 2008-08-12 17:16 幻浪天空领主 阅读(430) 评论(0)  编辑 收藏 引用 所属分类: USACO


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2011年6月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

导航

统计

常用链接

留言簿(1)

随笔档案(2)

文章分类(23)

文章档案(22)

搜索

最新评论

阅读排行榜

评论排行榜