【图的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;
}
}
}
上一篇: 前端面试题 CSS
下一篇: 面试-浏览器、Node环境下的导入导出