二分图判定

二分图定义:

二分图又称作二部图,是图论中的一种特殊模型。 设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;
}

 

posted @ 2019-12-27 15:41  correct  阅读(135)  评论(0)    收藏  举报