CF547D Mike and Fish 建图

Posted alan-luo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF547D Mike and Fish 建图相关的知识,希望对你有一定的参考价值。

题意:

  有点长→CF547DMike 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 }
染色

 

以上是关于CF547D Mike and Fish 建图的主要内容,如果未能解决你的问题,请参考以下文章

cf547D. Mike and Fish(欧拉回路)

codeforces #305 D Mike and Fish

Codeforces 247D Mike and Fish

CF547E Mike and Friends

CF 547E Mike and Friends

CF Round410 D. Mike and distribution