Reversible Cards ARC111 -B 思维,图论
Reversible Cards ARC111 -B 思维,图论
题意
有\(N\)张卡片,卡片正反面有颜色,正面颜色\(a_i\),反面颜色\(b_i\) 。问如何一次只能一面朝上摆放,如何拜访能让颜色种类最多,输出最多的种类数
\[1\leq N \leq 200000
\\
1 \leq a_i,b_i\leq 400000
\]
分析
抽象为图论模型,一次只能选择一面摆放,相当于对于一条边,一次只能选择其中一个端点。
有显然的结论:若是一条链,则至少有一个点无法被选到,若是一个环,则所有点都可以被选到。
因此我们可以动态判断是否形成了环来判断有没有贡献,这里用并查集优化
代码
int fa[400005];
int vis[400005];
int find(int x){
return x != fa[x] ? fa[x] = find(fa[x]) : x;
}
int main(){
int n = rd();
int res = 0;
for(int i = 1;i <= 400000;i++) fa[i] = i;
for(int i = 0;i < n;i++){
int x = rd();
int y = rd();
int xx = find(x);
int yy = find(y);
if(xx != yy && (!vis[xx] || !vis[yy])) fa[xx] = yy,vis[yy] |= vis[xx],res++;
else if(!vis[xx]) res++,vis[xx] = 1;
}
cout << res;
}