博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 547D Mike and Fish
阅读量:4618 次
发布时间:2019-06-09

本文共 1845 字,大约阅读时间需要 6 分钟。

Description

题目大意:有一个的网格图,给出其中的 \(n\) 个点,要你给这些点染蓝色或红色,满足对于每一行每一列都有红蓝数量的绝对值之差不超过1

Solution

首先建立二分图,点\((x,y)\)视作 \(x->y'\) 的一条边

问题转化为:给边染色,使得每一个点的两种颜色的数量之差不超过\(1\)

如果原图存在欧拉回路,那么沿着欧拉回路交替染色即可(因为一定是偶环)

但是实际上存在度数为奇数的点,不能够成欧拉回路,所以我们先把它变成欧拉回路

容易发现度数为奇数的点的数量是偶数,那么我们新加一些边,使得奇数点两两匹配连边,那么度数就变成了偶数

然后我们发现这样原图就不一定是二分图了,有可能存在奇环(只有起始点会矛盾)

我们先把度数为奇数的点遍历掉,如果没有被遍历到的就都是偶环了,黑白染色肯定符合要求,我们可以直接丢掉

实际上我们只需要从新加入的边开始找欧拉回路就行了,因为这条边实际上是废边

如何证明正确性?
因为矛盾的情况一定是起始点存在某种颜色多了\(1\),而废边正好把这个多了的给消除了,所以是合法的

注意:找欧拉回路时,走过的边就可以不走了,那么就可以从邻接表上直接删除,不然复杂度会出问题

#include
using namespace std;const int N=400400,M=2e5;int n,head[N],nxt[N<<1],to[N<<1],num=1,in[N],q[N],top=0,tot;bool vis[N],ans[N],v[N<<1];int id[N<<1];inline void link(int x,int y,int ID){nxt[++num]=head[x];to[num]=y;head[x]=num;id[num]=ID;}inline void dfs(int x){ vis[x]=1; int i; while(head[x]){ i=head[x]; head[x]=nxt[i]; if(v[i])continue; v[i^1]=1,dfs(to[i]); q[++top]=id[i]; }}int main(){ int x,y; scanf("%d",&n);tot=M<<1; for(int i=1;i<=n;i++){ scanf("%d%d",&x,&y); link(x,y+M,i);link(y+M,x,i); in[x]++;in[y+M]++; } static int lis[N],cnt=0; for(int i=1;i<=tot;i++)if(in[i]&1)lis[++cnt]=i; for(int i=1;i<=cnt;i+=2)link(lis[i],lis[i+1],0),link(lis[i+1],lis[i],0); bool c=0; for(int i=1;i<=cnt;i++){ if(!vis[lis[i]]){ dfs(lis[i]);c=0; while(top){ c^=1; if(q[top])ans[q[top]]=c; q[top--]=0; } } } for(int i=1;i<=tot;i++){ if(!vis[i]){ dfs(i);c=0; while(top){ c^=1; if(q[top])ans[q[top]]=c; q[top--]=0; } } } for(int i=1;i<=n;i++)printf("%c",ans[i]?'r':'b'); return 0;}

转载于:https://www.cnblogs.com/Yuzao/p/8485991.html

你可能感兴趣的文章
DBCP连接池配置参数说明
查看>>
C语言实现四舍五入
查看>>
SSH创建公钥实现无密码操作失败原因
查看>>
【转】Javascript模块化编程(三):require.js的用法
查看>>
需求规格说明书
查看>>
python mysql 查询返回字典结构
查看>>
mysql 统计sql
查看>>
Java中的抽象类
查看>>
关于Altium Designer的BOM,元件清单
查看>>
使用MongoDB ruby驱动进行简单连接/CRUD/运行命令
查看>>
关于set和multiset的一些用法
查看>>
基础训练 芯片测试
查看>>
如何用命令将本地项目上传到git
查看>>
JavaScript 实现鼠标拖动元素
查看>>
js 模糊查询 (360接口)
查看>>
python+rabbitMQ实现生产者和消费者模式
查看>>
“模态”对话框和“后退”按钮
查看>>
关于javascript实现的网站页面侧边悬浮框"抖动"问题
查看>>
for循环与for循环嵌套
查看>>
NEU 1515 Play with bear kid
查看>>