算法二分图的判定
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法二分图的判定相关的知识,希望对你有一定的参考价值。
二分图的判定
给定一个具有n个顶点的图。要给图上每个顶点染色,并且要使相邻的顶点颜色不同。
判断是否能最多用两种颜色进行染色。题目保证没有重边和自环。
概念:把相邻顶点染成不同颜色的问题叫做图的着色问题。对图进行染色所需要的最小颜色数称为最小着色度。
最小着色度为2的图称作二分图。
分析:如果只用两种颜色,那么确定一个顶点的颜色之后,和它相邻的顶点的颜色也就确定了。
因此,选择任意一个顶点出发,依次确定相邻顶点的颜色,就可以判断是否可以被2种颜色染色了。
这个问题用深度优先搜索可以简单实现。
#include <bits\stdc++.h> using namespace std; #define MAX_V 1000 //输入 vector<int> G[MAX_V]; //图 int V; //顶点数 int color[MAX_V]; //顶点的颜色 (1 or -1) //顶点v,颜色c bool dfs(int v,int c){ color[v] = c; //把当前顶点相邻的顶点扫一遍 for(int i = 0;i < G[v].size(); i++){ //如果相邻顶点已经被染成同色了,说明不是二分图 if(color[G[v][i]] == c) return false; //如果相邻顶点没有被染色,染成-c,看相邻顶点是否满足要求 if(color[G[v][i]] == 0 && !dfs(G[v][i],-c)) return false; } //如果都没问题,说明当前顶点能访问到的顶点可以形成二分图 return true; } void solve(){ //可能是不连通图,所以每个顶点都要dfs一次 for(int i = 0;i < V; i++){ if(color[i] == 0){ //第一个点颜色为 1 if(!dfs(i,1)){ cout << "No" << endl; return; } } } } int main(){ //输入 }
以上是关于算法二分图的判定的主要内容,如果未能解决你的问题,请参考以下文章