*题解: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;
}
/*
*/

浙公网安备 33010602011771号