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 }
染色

 

转载于:https://www.cnblogs.com/Alan-Luo/p/10432324.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值