1 solutions

  • 0
    @ 2025-3-3 16:21:28

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    int n,m,k;
    int f[20001];
    int t[20001];
    int cnt,a[20001];
    bool u[20001];
    int ans;
    int find(int x)
    {
        if(f[x]==x) return f[x];
        f[x]=find(f[x]);
        return f[x];
    }
    void merge(int x,int y)
    {
        f[find(x)]=f[find(y)];
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for(int i=1;i<=n;i++) f[i]=i;
        for(int i=1;i<=k;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            if(find(x)!=find(y)) merge(x,y);
        }
        for(int i=1;i<=n;i++) f[i]=find(f[i]);
        for(int i=1;i<=n;i++) t[f[i]]++;
        for(int i=1;i<=n;i++)
        {
            if(t[i])
            {
                a[++cnt]=t[i];
            }
        }
        u[0]=1;
        for(int i=1;i<=cnt;i++)
        {
            for(int j=n-a[i];j>=0;j--)
            {
                if(u[j]) u[j+a[i]]=1;
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(u[i]&&abs(ans-m)>abs(i-m)) ans=i;
        }
        printf("%d",ans);
        return 0;
    }
    
    • 1

    Information

    ID
    9975
    Time
    1000ms
    Memory
    128MiB
    Difficulty
    (None)
    Tags
    # Submissions
    0
    Accepted
    0
    Uploaded By