题解
【提高】比赛组队
1 条题解
-
0
#include<bits/stdc++.h> using namespace std; int f[20001]; int find(int x){ if(f[x]!=x)f[x]=find(f[x]); return f[x]; } int main(){ int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++)f[i]=i; for(int i=0;i<k;i++){ int a,b; scanf("%d%d",&a,&b); int fa=find(a),fb=find(b); if(fa!=fb)f[fa]=fb; } int cnt[20001]={0}; for(int i=1;i<=n;i++)cnt[find(i)]++; int dp[20001]={0}; dp[0]=1; for(int i=1;i<=n;i++) if(cnt[i]) for(int j=20000;j>=cnt[i];j--) if(dp[j-cnt[i]])dp[j]=1; int ans=0,minv=20001; for(int i=0;i<=20000;i++) if(dp[i]){ int diff=abs(i-m); if(diff<minv||(diff==minv&&i<ans)){ minv=diff; ans=i; } } printf("%d",ans); return 0; }
- 1