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

判断是否为二分图

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

二分图:对图进行染色所需的最小颜色数,成为最小着色数。最小着色数为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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值