我是靠谱客的博主 粗暴钢笔,这篇文章主要介绍判断二分图——染色法,现在分享给大家,希望可以做个参考。

  • 怎么判定一个图是否为二分图
    从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图,每次用bfs遍历即可。

  • 代码:

#include <queue>

#include <cstring>

#include <iostream>

using namespace std;
const int N = 999;
int col[N], Map[N][N];
//0为白色,1为黑色

bool BFS(int s, int n)
{
queue<int> p;
p.push(s);
col[s] = 1;
//将搜索起始点涂成黑色
while(!p.empty())
{
int from = p.front();
p.pop();
for(int i = 1; i <= n; i++)
{
if(Map[from][i] && col[i] == -1) //如果从from到i的边存在(为邻接点) && i点未着色
{
p.push(i);
//将i点加入队列
col[i] = !col[from];//将i点染成不同的颜色

}
if(Map[from][i] && col[from] == col[i])//如果从from到i的边存在(为邻接点) && i点和from点这一对邻接点颜色相同,则不是二分图

return false;
}
}
return true;
//搜索完s点和所有点的关系,并将邻接点着色,且邻接点未发现相同色则返回true

}
int main()
{
int n, m, a, b;
memset(col, -1, sizeof(col));
cin >> n >> m;
//n 为有多少点,m为有多少边

for(int i = 0; i < m; i++)
{
cin >> a >> b;
Map[a][b] = Map[b][a] = 1;
}
bool flag = false;
for(i = 1; i <= n; i++)
//遍历并搜索各个连通分支
{
if(col[i] == -1 && !BFS(i, n)) //每次找没有着色的点进行判断,如果从它开始BFS发现相同色邻接点则不是二分图
{
flag = true;
break;
}
}
if(flag)
cout << "NO" <<endl;
else
cout << "YES" <<endl;
return 0;
}

最后

以上就是粗暴钢笔最近收集整理的关于判断二分图——染色法的全部内容,更多相关判断二分图——染色法内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部