D. Social Network
链接
题意:
并查集维护
答案取可连接的连通块的和(最大)
最开始只能连接一个
当两个人在一个并查集里面的时候就可以再连一个连通块
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 10 ;
int p[N] , si[N] ;
int find(int x ){
if(p[x] != x ) p[x] = find(p[x]) ;
return p[x] ;
}
bool cmp(int a , int b ) {
return a>b ;
}
int main(){
int n ,d ;
cin>>n >>d ;
int maxSize = 0 ;
for(int i = 1 ; i <= n ;i ++ ) p[i] = i ,si[i] = 1 ;
int cnt = 1;
while(d -- ){
int x , y ;
cin>>x >>y ;
int fx = find(x) , fy = find(y) ;
if(fx != fy) {
p[fx] = fy ;
si[fy] += si[fx] ;
}
else cnt ++ ;
vector<int >ve ;
for(int i = 1 ; i <= n ;i ++ )
if(p[i] == i )
ve.push_back(si[i]) ;
sort(ve.begin() , ve.end() ,cmp) ;
int ans = 0 ;
for(int i = 0 ; i < cnt ; i ++ ) {
//cout<<ve[i] <<" ";
ans += ve[i] ;
}
cout<<ans - 1 <<endl;
}
return 0 ;
}