算法——判断二分图

  • 注释:
  • 算法核心:若一个图是二分图,则它的充要条件是所有回路都是偶数,即每个回路可以用两种颜色染色,即该图可以用两种颜色染色,可以直接用 d f s \small dfs dfs染色判断是否可以用两种颜色染色。
  • 演示图解
    算法——判断二分图_第1张图片
    算法——判断二分图_第2张图片
    算法——判断二分图_第3张图片
  • 代码
#include
#include
using namespace std;

const int maxn = 1e5 + 10;

//用1和-1染色,染色的数组
int col[maxn];
//用向量建图
vector<int>vt[maxn];

//判断u结点是否可以用c染色
//参数含义  --  u : 结点  c : 颜色
bool judge(int u, int c) {
	//如果u结点未染色,将u结点染为c
	if (col[u] == 0) col[u] = c;
	//遍历与u结点相连的结点
	for (int i = 0; i < vt[u].size(); i++) {
		//保存u相连的结点,方便书写
		int v = vt[u][i];
		//如果u,v颜色相同,说明不可以用两种颜色染色
		if (col[v] == col[u]) return 0;
		//如果v没有染色且v不能用-c染色,说明不可以用两种颜色染色
		if (col[v] == 0 && !judge(v, -c)) return 0;
	}
	return 1;
}
int main() {

	//v : 点数  e : 边数 
	int v, e;
	cin >> v >> e;

	while (e--) {
		int u, v;
		cin >> u >> v;
		//建无向图
		vt[u].push_back(v);
		//有向图去掉这句话
		vt[v].push_back(u);
	}

	//多组输入的话初始化
	//memset(col, 0, sizeof col);
	for (int i = 1; i <= v; i++) {
		//如果未染色,判断这个点可不可以用1染色
		if (col[i] == 0) {
			if (judge(i, 1) == 0) {
				cout << "No" << endl;
				return 0;
			}
		}
	}

	cout << "Yes" << endl;
	return 0;
}

你可能感兴趣的:(算法,图论)