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

把相邻结点染成不同颜色称为图的着色问题
对图进行着色的最小颜色数为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;
		}
	}
}
发布了77 篇原创文章 · 获赞 100 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/S_123789/article/details/104429169