可能是我对题目理解的问题,只得了27分
#include<bits/stdc++.h>
using namespace std;
const int N=10005;
int f[N],point[N];
int main()
{
int i,j,n,m,k,x,y,cntp=0,ans,far;
cin>>n>>m>>k;
if(!k)//k如果是0,直接输出m
{
cout<<m;
return 0;
}
for(i=1;i<=k;i++)
{
cin>>x>>y;
if(!point[x])//x没有分组
{
if(!point[y])//y没有分组
{
point[x]=point[y]=++cntp;//归进一个新的组里
f[cntp]+=2;
}
else//y分组了
{
point[x]=point[y];//都归进y的组里
f[point[x]]++;
}
}
else//x分组了
{
if(!point[y])//y没有分组
{
point[y]=point[x];//都归进x的组里;
f[point[y]]++;
}
else//y分组了
{
//要都归进到x里
f[point[y]]=1e9;//y的那一组要设一个最大值
for(j=1;j<=i;j++)
{
if(point[j]==point[y]&&j!=y)//如果两个组一样,就归进x,但是如果j==y原始的y就会失踪
{
point[j]=point[x];
f[point[j]]++;
}
}
point[y]=point[x];//最后把y归进x里
f[point[y]]++;
}
}
}
ans=f[1],far=abs(f[1]-m);//打擂台找差距最小
for(i=2;i<=cntp;i++)
{
if(far>abs(f[i]-m))
{
far=abs(f[i]-m);
ans=f[i];
}
else if(far==abs(f[i]-m))
{
ans=min(ans,f[i]);
}
}
cout<<ans;
return 0;
}