码迷,mamicode.com
首页 > 其他好文 > 详细

CF547D Mike and Fish 建图

时间:2019-02-25 18:37:26      阅读:817      评论:0      收藏:0      [点我收藏+]

标签:clu   ret   one   tps   一个   org   else   ros   class   

题意:

  有点长→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 建图

标签:clu   ret   one   tps   一个   org   else   ros   class   

原文地址:https://www.cnblogs.com/Alan-Luo/p/10432324.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!