Loading

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;
} 
posted @ 2021-02-05 10:07  MQFLLY  阅读(204)  评论(0编辑  收藏  举报