1 条题解

  • 0
    @ 2025-11-30 16:28:07

    C :

    #include <stdio.h>
    #include <stdlib.h>
    #define N 1010
    
    int f[N], a[N][N], c[N];
    
    int find(int v){
    if(f[v] == v)return v;
    int F = find(f[v]);
    f[v] = F;
    return F;
    }
    
    int main()
    {
        int n;
        while(scanf("%d",&n) != EOF){
            for(int i = 1;i <= n; i++){
                f[i] = i;
                c[i] = 1;
            }
            for(int i = 1;i <= n; i++){
                scanf("%d",&a[i][0]);
                for(int j = 1;j <= a[i][0]; j++){
                    scanf("%d",&a[i][j]);
                }
            }
            for(int i = n;i >= 1; i--){
                for(int j = 1;j <= a[i][0]; j++){
                    if(a[i][j]>i){
                        int r1 = find(i);
                        int r2 = find(a[i][j]);
                        if(r1 != r2){
                            f[r2] = r1;
                            c[r1] += c[r2];
                            if(c[r1]>(n>>1)){
                                printf("%d\n",i);
                                return 0;
                            }
                        }
                    }
                }
            }
        }
        return 0;
    }
    

    C++ :

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int f[1001],n,a[1001][1001],count[10001];
    void init();
    int find(int);
    void work();
    int main()
    {
    	//freopen("black0.in","r",stdin);
    	init();
    	work();
    	return 0;
    }
    void init()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)
    	{
    		count[i]=1;
    		f[i]=i;
    	}
    	memset(a,0,sizeof(a));
    	for(int i=1;i<=n;i++)
    	{
    		cin>>a[i][0];
    		for(int j=1;j<=a[i][0];j++) cin>>a[i][j];		
    	}
    }
    void work()
    {
    	for(int i=n;i>0;i--)
    	{
    		for(int j=1;j<=a[i][0];j++)
    		{
    			if(a[i][j]>i)
    			{
    				int x,y;
    				x=find(i);
    				y=find(a[i][j]);
    				if(x!=y)
    				{
    					f[y]=x;
    					count[x]+=count[y];	
    					if(count[x]>(n+1)/2)
    					{
    						cout<<i<<endl;
    						return;
    					}
    				}
    				
    			}			
    		}		
    	}
    }
    int find(int x)
    {
    	if(f[x]==x) return x;
    	f[x]=find(f[x]);
    	return f[x];
    }
    
    • 1

    信息

    ID
    1448
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者