二分图相关知识指南
将原贴中判断二分图的代码按自己的习惯改了一下:
#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
using namespace std;
int vexnum, edgenum;
bool dfs(vector<int> color, vector<vector<int>> node, int v, int c);
void solve(vector<int> color, vector<vector<int>> node);
int main()
{
cout << "请输入顶点和边的个数:" << endl;
cin >> vexnum >> edgenum;
vector<vector<int>> node(vexnum);
vector<int> color(vexnum, 0);
cout << "请输入边的顶点信息:" << endl;
for (int i = 0; i < edgenum; ++i)
{
int u, v;
cin >> u >> v; //因为是无向图,所以要双向插入顶点
node[u].push_back(v); //在u点后插入v顶点
node[v].push_back(u); //在v点后插入u顶点
}
solve(color, node);
return 0;
}
void solve(vector<int> color, vector<vector<int>> node)
{
for (int i = 0; i < vexnum; ++i)
{
//遍历所有顶点
if (color[i] == 0)
{
//如果未染色,就进入深搜
if (!dfs(color, node, i, 1))
{
printf("NOT BICOLORABLE.\n"); //如果返回false值,就不是二分图
return; //结束搜索
}
}
}
printf("BICOLORABLE.\n"); //未出现相邻同色,就是二分图
}
bool dfs(vector<int> color, vector<vector<int>> node, int v, int c)
{
color[v] = c; //为当前顶点上色
for (int i = 0; i < int(node[v].size()); ++i)
{
//遍历所有与之连接的顶点,即相邻顶点
if (color[node[v][i]] == c) //如果相邻的顶点同色,就返回false
{
return false;
}
if (color[node[v][i]] == 0 && !dfs(color, node, node[v][i], -c)) //如果相邻顶点未染色,就将其染为相反颜色即-c,并继续dfs
{
return false; //返回false
}
}
return true; //直到所有顶点都被染色,且没出现相邻同色顶点,就返回true
}