Reversible Cards ARC111 -B 思维,图论
题意
有(N)张卡片,卡片正反面有颜色,正面颜色(a_i),反面颜色(b_i) 。问如何一次只能一面朝上摆放,如何拜访能让颜色种类最多,输出最多的种类数
[1leq N leq 200000
\
1 leq a_i,b_ileq 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;
}