2021牛客寒假算法基础集训营1 红和蓝(二分图染色)
发布日期:2021-06-30 10:28:22
浏览次数:2
分类:技术文章
本文共 1140 字,大约阅读时间需要 3 分钟。
最后构造的树一定可以分为若干段连续的长度为 2 2 2的连通块
连通块内的颜色相同
容易想到叶子节点一定是和父节点同色的
那么我们可以 d f s dfs dfs
如果这个节点分了组,跳过
如果没分组,让他和父亲在一个组(只能这么做)
这样实际上我们每次都是在给叶子节点和它的父节点分组
同组内的颜色相同,于是就可以染色了
#includeusing namespace std;const int maxn = 3e5+10;struct edge{ int u,to,nxt;}d[maxn]; int head[maxn],cnt=1;void add(int u,int v){ d[++cnt] = (edge){ u,v,head[u]},head[u] = cnt; }int ok[maxn],id,col[maxn],n,flag = 1;vector vec[maxn];void dfs(int u,int fa){ for(int i=head[u];i;i=d[i].nxt ) { int v = d[i].to; if( v==fa ) continue; dfs(v,u); } if( ok[u] ) return; if( ok[u]==0&&ok[fa]==0&&i!=1 ) ok[u] = ok[fa] = ++id;//分组 else flag = 0;} void ran(int u,int fa){ col[u] = col[fa]^1; for(auto v:vec[u] ) { if( v==fa ) continue; ran(v,u); }}signed main(){ cin >> n; for(int i=1;i > l >> r; add(l,r); add(r,l); } dfs(1,0); if( flag==0 ){ cout << "-1"; return 0; } for(int i=2;i<=cnt;i+=2) { int u = d[i].to, v = d[i].to; if( ok[u]==ok[v] ) continue; vec[ok[u]].push_back(ok[v]); vec[ok[v]].push_back(ok[u]); } ran(1,0); for(int i=1;i<=n;i++) { if( col[ok[i]]==0 ) cout << "R"; else cout << "B"; }}
转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/113576986 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年05月02日 02时56分23秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
easyui修改回显使用form("load",row)
2019-04-30
mysql解决中文乱码问题
2019-04-30
点击劫持漏洞:使用X-Frame-Options 解决方法(应用tomcat)
2019-04-30
tar查看压缩包的内容,而不解压
2019-04-30
linux中命令cp复制拷贝访问权限和修改时间
2019-04-30
ifconfig命令常用方式
2019-04-30
linux使用内核模块和驱动
2019-04-30
linux中查找某目录下文件内容中出现某关键字
2019-04-30
Linux sync命令的作用分析
2019-04-30
linux系统命令vi存盘退出的其他方法
2019-04-30
vi光标移动及定位
2019-04-30
修改或隐藏Nginx的版本号
2019-04-30
linux中文本编辑vi命令插入技巧
2019-04-30
linux中vi中的剪切和删除
2019-04-30
linux中的vi命令文本查找
2019-04-30
vim搜索设置高亮和取消高亮
2019-04-30
linux配置vi
2019-04-30
vimdiff比较两个文件
2019-04-30
linux安装tftp服务器
2019-04-30
windows下mysql的安装
2019-04-30