*题解:CF741C CF741C Arpa’s overnight party and Mehrdad’s silent entering

题目链接

解析

读完题很容易想到二分图染色。于是尝试构造二分图,先在男女朋友之间连边,然后来看环上的限制。

题目说要保证环上连续三个点中有两种颜色,一种最简单粗暴的方法就是连接 \(1\)\(2\)\(3\)\(4\)\(\dots\)\(2n - 1\)\(2n\)。事实上,这样连出来的图就是二分图。因为每个点有且仅有一条朋友之间的边,有且仅有一条环上的边,故如果有环,我们可以用两类边交替的顺序来遍历这个环,不存在奇环,为二分图。

时间复杂度 \(O(n)\)

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 2e5 + 5,M = 300000 + 5,K = 10000 + 5;
int a[N],b[N],col[N];
vector<int> g[N];
void dfs(int x,int c){
	if(col[x] != -1){
		if(col[x] != c)
			cerr<<"???"<<" "<<x<<'\n';
		return;
	}
	col[x] = c;
	for(int nx : g[x]){
		dfs(nx,c ^ 1);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);	
//	freopen("in.txt","r",stdin);
//	freopen("out1.txt","w",stdout);
	memset(col,-1,sizeof(col));
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]>>b[i];
		g[a[i]].push_back(b[i]);
		g[b[i]].push_back(a[i]);
	}
	for(int i=1;i<=n;i++){
		g[2 * i - 1].push_back(2 * i);
		g[2 * i].push_back(2 * i - 1);
	}
	for(int i=1;i<=2 * n;i++){
		if(col[i] == -1){
			dfs(i,0);
		}
	}
	for(int i=1;i<=n;i++){
		cout<<col[a[i]] + 1<<" "<<col[b[i]] + 1<<'\n';
	}
	return 0;
}
/*
*/
posted @ 2026-08-22 19:24  yutar  阅读(6)  评论(0)    收藏  举报