Reversible Cards ARC111 -B 思维,图论

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;
} 
原文地址:https://www.cnblogs.com/hznumqf/p/14376220.html