连通快+二分图,每次+二分图大的元素个数。
#include<bits/stdc++.h> using namespace std; typedef unsigned long long ULL; typedef long long LL; const int N=2e4+10; bool ex[N],vis[N]; vector<int>e[N]; int n,au,av; void DFS(int u,int flag) { if(flag) av++; else au++; int sz=e[u].size(); for(int i=0;i<sz;i++) { int v=e[u][i]; if(vis[v]) continue; vis[v]=true; DFS(v,1-flag); } } int main() { int cas=1,T; scanf("%d",&T); while(T--) { int u,v; scanf("%d",&n); for(int i=1;i<=20000;i++) e[i].clear(); memset(ex,false,sizeof(ex)); for(int i=0;i<n;i++) { scanf("%d%d",&u,&v); ex[u]=ex[v]=true; e[u].push_back(v); e[v].push_back(u); } memset(vis,false,sizeof(vis)); int ans=0; for(int i=1;i<=20000;i++) { if(ex[i]&&!vis[i]){ au=0; av=0; vis[i]=true; DFS(i,0); ans=ans+max(au,av); } } printf("Case %d: %d ",cas++,ans); } return 0; }