欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【图的dfs】—— 图的着色问题(二分图)

程序员文章站 2022-06-09 17:58:09
...

把相邻结点染成不同颜色称为图的着色问题
对图进行着色的最小颜色数为2时称为二分图

思路:这里对图的表示采取邻接表,然后就是常规的深搜。

step 1:创建邻接表的类,包含基本的API:

import java.util.ArrayList;
import java.util.List;

public class GraphNode_AL {
	   //邻接表的表示使用ArrayList来表示邻居
		public int val;
		
		//邻居节点
		private List<GraphNode_AL> neighbors;
		
		//当前的节点是否被访问
		public boolean checked = false;
		
		//构造方法
		public GraphNode_AL(int val) {
			this.val = val;
		}
		
		//增加邻居节点
		public void add(GraphNode_AL node){
			if(this.neighbors == null)
				neighbors = new ArrayList<GraphNode_AL>();
			//不为空的时候加入当前的邻居
			this.neighbors.add(node);	
		}
		
		public GraphNode_AL getNeighbor(int i){
			return this.neighbors.get(i);			
		}
		
		//获取当前节点邻居的个数
		public int size(){
			return this.neighbors.size();
		}
	}

step 2

public class Main{
	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++){  //遍历所有邻居neighnor
			MyNode neighnor = (MyNode) node.getNeighbor(i);
			//如果相邻颜色相同
			if(neighnor.color == c)  return false;
			//没有被染色,就染不同的颜色
			if(neighnor.color == 0){
				if(dfs(neighnor,-c) == false)
				      return false;
			}
		}
		return true;
	}
	
	
	static class MyNode extends GraphNode_AL{
		int color;
		public MyNode(int val) {
			super(val);
		}
		public MyNode(int val,int color){
			super(val);
			this.color = color;
		}
	}
}