题目链接
题意:
如果不在连通块里就连一条边,在的话,任意与其它的连一条边,求连通块最大数目
思路:
并查集求连通块数目,如果已经联通,就排序找到前几个大的连通块连接起来
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1010;
int p[N],cnt[N];
int find(int x)
{
if(p[x]!=x)p[x]=find(p[x]);
return p[x];
}
signed main()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)p[i]=i,cnt[i]=1;
int m=1;
while(q--)
{
int res=0;
vector<int>vec;
int a,b;cin>>a>>b;
int pa=find(a),pb=find(b);
if(pa!=pb)
{
cnt[pb]+=cnt[pa];
p[pa]=pb;
}
else m++;
for(int i=1;i<=n;i++)if(p[i]==i)vec.push_back(cnt[i]);
sort(vec.begin(),vec.end(),greater<int>());
for(int i=0;i<m;i++)res+=vec[i];
cout<<res-1<<'\n';
}
}