思路:对于入度最多的点即边最多的点,首先找到边最多的点,ans=边数。然后利用并查集求出区域块的个数s,对于除自己所在的区域块可以直接连一条边,ans=ans+s-1,然后再连一个点的话就需要消一条边以防止有环,ans=ans+k,还需要判断其不能大于n-1.
Code :
#include<iostream>
#include<algorithm>
#include<vector>
#include<cstring>
#include<map>
using namespace std;
const int MAX_N=200005;
int n,m,k,T;
int d[MAX_N];
int id[MAX_N];
int Find(int x)
{
if(id[x]!=x) id[x]=Find(id[x]);
return id[x];
}
int main()
{
ios::sync_with_stdio(false);
cin>>T;
while(T--){
memset(d,0,sizeof(d));
cin>>n>>m>>k;
for(int i=0;i<n;++i)
id[i]=i;
int u,v;
for(int i=0;i<m;++i)
{
cin>>u>>v;
id[Find(u)]=Find(v);
d[u]++; d[v]++;
}
int s=0;
for(int i=0;i<n;++i)
s=max(s,d[i]);
map<int,int> imap;
for(int i=0;i<n;++i)
imap[Find(id[i])]++;
s+=imap.size()-1;
s=min(n-1,s+k);
cout<<s<<endl;
}
return 0;
}