UVA 10004 Bicoloring (二分染色)
题目链接:https://vjudge.net/problem/UVA-10004
题意:给你一个连通图,问能否将每个节点染成两种颜色之一,使得每条边两边的节点颜色不同。
(本质就是二分图的判定,有个定理是:一个无向图为二分图当且仅当图G中无奇数长度的回路。)
解题思路:
可以用dfs染色,对没有染过的点染色,如果该节点之前被染过且与当前要染的颜色不同那么就不能构成二分图。
dfs到了染过色的点记得return,否则有环的图会死循环的。
建边用了链式前向星
struct node
{int to,last;///to表示这条边的终点,last表示同一起点出发的上一条建的边的id
}edge[N<<1];
int head[N],id;///head[i]储存上一个节点i为起点的边(会随着建边不断更新)void add(int u,int v)///建边
{edge[id].to = v;edge[id].last = head[u];head[u] = id++;
}for (int i=head[now];i!=0;i=edge[i].last)///遍历
本题代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define debug(x) printf("----Line %s----\n",#x)
using namespace std;const int N = 2e2+5;struct node
{int to,last;
}edge[N<<1];
int head[N],id;
int col[N];///节点颜色
bool flag;///是否可以二分染色void add(int u,int v)
{edge[id].to = v;edge[id].last = head[u];head[u] = id++;
}void dfs(int now,int pre,int color)///pre表示父节点
{if (~col[now] && col[now]!=color){flag = false;return ;}if (!flag) return ;if (~col[now]) return ;col[now] = color;color = (color==1 ? 2:1);for (int i=head[now];i!=0;i=edge[i].last){if (edge[i].to!=pre){dfs(edge[i].to,now,color);}}
}int main()
{int n;while (scanf("%d",&n),n){int m;for (int i=1;i<=n;i++) head[i] = 0,col[i] = -1;///初始化//memset(head,0,sizeof head);//memset(col,-1,sizeof col);id = 1,flag = true;///初始化scanf("%d",&m);while (m--){int u,v;scanf("%d %d",&u,&v);u++,v++;add(u,v);//debug(1);add(v,u);}dfs(1,1,1);//debug(2);if (flag) printf("BICOLORABLE.\n");else printf("NOT BICOLORABLE.\n");}return 0;
}
UVA 10004 Bicoloring (二分染色)相关推荐
- UVA 10004 - Bicoloring
模拟染色,因为只有两种颜色,所以分别用 0. 1 代表这两种颜色,然后从0开始深搜,如果 每个点都能染上色,且相邻两点的颜色不同,则符合要求. #include<stdio.h>#incl ...
- UVA 10004 Bicoloring
UVA_10004 对于这个题目,我们可以直接模拟染色的过程即可,如果发现要涂某一块时这个块已经被涂了色,并且与我们要使用的颜色不同的话,就说明这个图不能被染成BICOLORABLE的. #inclu ...
- CF-85E.Guard Towers(二分+染色)
CF-85E.Guard Towers(二分+染色) 题目链接 题意 nnn个灯塔分成2分,求出最小的曼哈顿距离和其方案树 题意 二分+染色 二分枚举最小值midmidmid,判断能否将nnn个灯塔分 ...
- bzoj1728[Usaco2006 Open]Two-Headed Cows 双头牛 二分+染色
题意挺显然的就不说了. 这题我= =丢脸丢大了.. 一开始我觉得这题双头牛的模型有点像网络流,想了想反手给自己一耳光.. 然后觉得二分可做?但是怎么判断啊? dp不可做啊,这个条件要用上的话时间会炸. ...
- UVa 11627 - Slalom 二分. oj错误题目 难度: 0
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVA - 11478 Halum 二分+差分约束
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=34651 题意: 给定一个有向图,每一条边都有一个权值,每次你可以 ...
- uva 11080(二分图染色)
题意:一个国王要派若干士兵看守王国.王国是一张无向图,然后士兵只能站在点上.每个士兵的看守范围是临近的点与边,士兵看管的的边不能重复.问最少用多少个士兵能使每个点和边都有人看守. 思路:这道题可以抽象 ...
- 紫书 例题8-10 UVa 714 (二分答案)
这道题让最大值最小, 显然是二分答案 当题目求的是最大值最小, 最小值最大, 这个时候就要想到二分答案 为什么可以二分答案呢, 因为这个时候解是单调性的, 如果简单粗暴一点 就全部枚举一遍, 验证答案 ...
- Uva 10004(二分图的判定)
这题其实很简单的说,第一次用邻接表来存图= = 首先图的储存结构是结构体+head数组...其实head数组保存的 struct node {int v;int next; }V[200*200]; ...
最新文章
- Pycharm中使用github
- android自带蓝牙例子详解
- 使用Keras构建具有自定义结构和层次图卷积神经网络(GCNN)
- 这是预编译工具生成的文件_组件化架构 10.编译优化
- IOS中UITableview中封装九宫格
- jQuery插件开发
- word List 34
- PHP学习——定界符格式引起的错误
- 2018年1月3日-江苏地税系统无法正常登陆的解决方案
- 计算SRTM的高程异常的参考
- CentOS install btsync
- 基于SpringBoot的在线问卷调查管理系统
- POJ3764 The xor-longest Path
- 计算机word窗口的组成,word文件的组成
- 实例讲解PMP相关方参与度评估矩阵
- JavaSe复习笔记
- git push错误failed to push some refs to的解决
- 美发明家脑洞大开 预测十几年后电脑会产生感情
- CVE-2020-0787复现
- mysql索引怎么设计,MySQL如何设计索引