Description
某个地区有n(n<=1000) 个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1−n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团。犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为 n)。
现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过 n/2。为达到最好的效果,他们将按顺序打击掉编号 11 到 k 的犯罪团伙,请编程求出 k 的最小值。
Input Format
第一行一个正整数 n。
接下来的 n 行每行有若干个正整数,第一个整数表示该行除第一个外还有多少个整数,若第 i 行存在正整数 k,表示i,k 两个团伙可以直接联系。
Output Format
一个正整数,为 k 的最小值。
Sample
样例输入
7
2 2 5
3 1 3 4
2 2 4
2 2 3
3 1 6 7
2 5 7
2 5 6
样例输出
1
code
#include<bits/stdc++.h>
using namespace std;
int n,a,b,flag,father[1010],sum[1010],arr[1010][1010];
int Find(int x){
if(x==father[x]) return x;
return father[x]=Find(father[x]);
}
void Union(int a,int b){
int fa=Find(a);
int fb=Find(b);
if(fa!=fb){
father[fa]=fb;
sum[fb]+=sum[fa];
if(sum[fb]>(n+1)/2){
cout<<a;
flag=1;
return;
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
father[i]=i;
sum[i]=1;
}
for(int i=1;i<=n;i++){
cin>>arr[i][0];
for(int j=1;j<=arr[i][0];j++){
cin>>arr[i][j];
}
}
for(int i=n;i>=1;i--){
if(flag==1) break;
for(int j=1;j<=arr[i][0];j++){
if(arr[i][j]>i) Union(i,arr[i][j]);
}
}
return 0;
}
此代码运行样例通过,提交只能得70分,请求各位大佬帮忙看一下问题出在哪