构图,每两个节点间有一条有向边,权重为股份,以每一个节点为开始节点,做一个DFS当该节点拥有某一个节点J的控制权的时候就从J开始做DFS,做完之后所有拥有股份>50%的按照要求输出。
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
int map[101][101],cnt[101],Max;
bool vis[101],own[101];
void dfs(int x)
{
if(vis[x])
return;
vis[x]=true;
for(int i=Max;i;i--)
{
cnt[i]+=map[x][i];
if(cnt[i]>50)
{
own[i]=true;
dfs(i);
}
}
}
int main()
{
freopen("concom.in", "r", stdin);
freopen("concom.out", "w", stdout);
int n,u,v,w;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>u>>v>>w;
map[u][v]+=w;
if(u>Max)
Max=u;
if(v>Max)
Max=v;
}
for(int i=1;i<=Max;i++)
{
memset(vis,0,sizeof(vis));
memset(own,0,sizeof(own));
memset(cnt,0,sizeof(cnt));
dfs(i);
for(int j=1;j<=Max;j++)
if(own[j]&&i!=j)
cout<<i<<" "<<j<<endl;
}
return 0;
}