记录哪些公司控制哪些公司,且当每次我们得知某公司控制了某公司百分之多少的股份,就更新控股信息。如果超过50就递归搜索公司j,每个公司至多只递归一次——这个关键,不然程序无法结束,所以得维护一个is_visit数组判断重复。
题没什么意思,可能是我想多了,一开始总觉得可以用DP,浪费了不少时间。
/*
ID: fairyroad
LANG: C++
TASK: concom
*/
#include <algorithm>
#include <cstdio>
using namespace std;
bool is_visit[101], con[101];
int a[101][101] = {}, stock[101], m;
void dfs(int x)
{
if (is_visit[x]) return;
is_visit[x] = true;
for (int i = m; i; --i)
{
stock[i] += a[x][i];
if (stock[i] > 50)
{
con[i] = true;
dfs(i);
}
}
}
int main()
{
int n, u, v, w;
freopen("concom.in", "r", stdin);
freopen("concom.out", "w", stdout);
for (scanf("%d", &n); n; --n)
{
scanf("%d%d%d", &u, &v, &w);
a[u][v] += w;
if (u > m) m = u;
if (v > m) m = v;
}
for (int i = 1; i <= m; ++i)
{
fill_n(stock+1, m, 0);
fill_n(is_visit+1, m, false);
fill_n(con+1, m, false);
dfs(i);
for (int j = 1; j <= m; ++j)
if (con[j] && i != j)
printf("%d %d\n", i, j);
}
}