有点长→CF547DMike and Fish。node
其实也没什么好分析的,我这也是看的题解。c++
(不过,那篇题解好像文字的代码不太对劲)ide
这里直接说作法,正确性自证:spa
对输入的,将横、纵坐标相等的点分别两两连边,以后只须要dfs跑一个染色,使得一条边两个端点颜色都不同便可,这样就能够肯定每个点放红色仍是蓝色,输出便可。(至于哪一个是红哪一个是蓝不重要,有spj)code
代码:blog
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=500005;int n,m; 4 struct node{int y,nxt;}e[2*N]; 5 int h[N],c=1,vis[N],ans[N][2]; 6 void add(int x,int y){ 7 e[++c]=(node){y,h[x]};h[x]=c; 8 e[++c]=(node){x,h[y]};h[y]=c; 9 } void dfs(int x,int y){ 10 if(vis[x]) return ;vis[x]=y; 11 for(int i=h[x];i;i=e[i].nxt) 12 dfs(e[i].y,1^y); 13 } int main(){ 14 scanf("%d",&n); 15 for(int i=1,x,y;i<=n;i++){ 16 scanf("%d%d",&x,&y); 17 if(ans[x][0]) 18 add(ans[x][0],i),ans[x][0]=0; 19 else ans[x][0]=i; 20 if(ans[y][1]) 21 add(ans[y][1],i),ans[y][1]=0; 22 else ans[y][1]=i; 23 } for(int i=1;i<=n;i++){ 24 dfs(i,0); 25 if(vis[i]) putchar('r'); 26 else putchar('b'); 27 } return 0; 28 }