判断是否为二分图
图的着色问题:把相邻顶点染成不同的颜色的问题
二分图:对图进行染色所需的最小颜色数,成为最小着色数。最小着色数为2的图称为二分图。
判断是否为二分图还是用深度优先遍历的思想。这里不需要用visited数组,给图的结点新增一个属性color,从任意结点开始,为其染色,染色的同时就相当于已经访问过了该结点,然后挨个访问这个点的邻居,为邻居染色,一旦发现某个点和他的邻居颜色一样,则不是二分图。
public class ColorTheGraph {
public static void main(String[] args) {
MyNode n1=new MyNode(1);
MyNode n2=new MyNode(2);
MyNode n3=new MyNode(3);
MyNode n4=new MyNode(4);
n1.add(n2);
n1.add(n4);
n2.add(n1);
n2.add(n3);
n3.add(n2);
n3.add(n4);
n4.add(n1);
n4.add(n3);
//任意顶点开始都可以
System.out.println(dfs(n1,1));
}
private static boolean dfs(MyNode node, int c) {
node.color=c;//同时标记已访问和着色
for(int i=0;i<node.size();i++)//遍历所有的邻居
{
MyNode neighbor=(MyNode)node.getNeighbor(i);
if(neighbor.color==c)//如果和邻居的颜色一样,返回false
return false;
if(neighbor.color==0/*&&!dfs(neighbor,-c)*/)
if(!dfs(neighbor,-c))//把neighbor染成不一样的颜色,如果失败了,返回false
return false;
}
return true;
}
}
class MyNode extends GraphNode{
int color;//加上颜色属性
public MyNode(int val) {
super(val);
}
public MyNode(int val,int color) {
super(val);
this.color=color;
}
}
来源:CSDN
作者:我不是肖奈
链接:https://blog.csdn.net/qq_41625102/article/details/104533962