java 判断是否为二分图 图的着色问题

别说谁变了你拦得住时间么 提交于 2020-02-28 07:12:14

判断是否为二分图

图的着色问题:把相邻顶点染成不同的颜色的问题

二分图:对图进行染色所需的最小颜色数,成为最小着色数。最小着色数为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;
	}
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!