转自:南阳理工1015
【二分图简介】
二分图:简单来说,如果图中点可以被分为两组,并且使得所有边都跨越组的边界,则这就是一个二分图。
准确地说:把一个图的顶点划分为两个不相交集 X 和 Y ,使得每一条边都分别连接X 、 Y 中的顶点。如果存在这样的划分,则此图为一个二分图。
二分图的一个等价定义是:不含有「奇数条边的环」的图。
图 1 是一个二分图。为了清晰,我们以后都把它画成图 2 的形式。
【思路】
如题目中所给的方法,我们从0节点依此对与他相联的边进行染色,有三种情况
1.如果节点没有染过色,就染上与它相反的颜色,推入队列,
2.如果节点染过色且相反,忽视掉
3.如果节点染过色且与父节点相同,证明不是二分图,return
int n,m;
vector<int> g[MAXN];
int color[MAXN];
void init(){
for(int i=0;i<n;i++){
g[i].clear();
color[i]=-1;
}
}
int bfs(){
queue<int>q;
q.push(0);
color[0]=1;
while(!q.empty()){
int t = q.front();
q.pop();
for(int i=0;i<g[t].size();i++){
if(color[g[t][i]]==color[t])//相邻节点颜色相同,不是二分图
return 1;
else if(color[g[t][i]]==-1)//未染色
{
color[g[t][i]]=-color[t];
q.push(g[t][i]);
}
}
}
return 0;
}