CF547D Mike and Fish 建图
题意:
分析:
其实也没什么好分析的,我这也是看的题解。
(不过,那篇题解好像文字的代码不太对劲)
这里直接说做法,正确性自证:
对输入的,将横、纵坐标相等的点分别两两连边,之后只需要dfs跑一个染色,使得一条边两个端点颜色都不一样即可,这样就可以确定每一个点放红色还是蓝色,输出即可。(至于哪个是红哪个是蓝不重要,有spj)
代码:
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 }