二分图判定
二分图定义:
二分图又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
简单来说就是,一个图中的点可以分成互不相交的两部分,每一个边的两个端点分别出自这两个部分
二分图的判定:染色法
遍历所有的顶点,如果顶点未被染色,就染色一次,通过dfs遍历他所有的直接邻接点,如果他们没被染色就染成与前面的点相反的颜色,如果染过色但是颜色与前面的点的颜色相同,则判定为不是二分图,如果程序执行到最后没有判定失败,则判定为二分图
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int head[N], nex[N], to[N];
int cnt = 0;
int vis[N];
void pre_work() {
memset(head, -1, sizeof head);
memset(nex, -1, sizeof nex);
memset(to, -1, sizeof to);
memset(vis, 0, sizeof vis);
}
void add(int a, int b) {
//添加边
nex[++cnt] = head[a];
to[cnt] = b;
head[a] = cnt;
}
bool color(int fa, int point, int colors) {
//dfs染色
bool f = true;
vis[point] = colors;
for (int i = head[point]; i != -1; i = nex[i]) {
if (!vis[to[i]] && to[i] != fa) {
f = f && color(point, to[i], -colors);
}
else if (vis[to[i]] && to[i] != fa) {
if (colors == vis[to[i]]) {
f = f && false;
}
else f = f && true;
}
}
return f;
}
bool check() {
bool f = true;
for (int i = 1; i <= 5; i++) {
if (!vis[i]) {
f = f && color(-1, i, 1);
}
}
return f;
}
int main()
{
//二分图判定--染色法
pre_work();
add(1, 2);
add(2, 1);
add(3, 2);
add(4, 3);
add(5, 4);
add(2, 3);
add(3, 4);
add(4, 5);
bool f = check();
if (f) {
cout << "Yes\n";
}
else cout << "No\n";
return 0;
}
本文来自博客园,作者:correct,转载请注明原文链接:https://www.cnblogs.com/correct/p/12861991.html

浙公网安备 33010602011771号