搞不懂这题怎么能算简单题…
这道题无论广度搜索还是深度搜索用处都不大…
以广度优先搜索为例:
如果同一层的节点直接包含路径 则很难被寻找到
因策这道题可以考虑时候用邻接表的方式进行存储
具体来时就是
Map<Integer, Vector> map = new HashMap<>();这个。
integer用来保存图的节点(无论是起点还是终点)
因为这个无论如何都可以进行染色,所以不妨先把1染成颜色1
之后每个图节点进行循环,确保每个节点之前的节点都已经被染色即可(例如第3个节点之前,确保1,2,已经被染色)
由于boolean[] used = new boolean[5];
循环中每次都刷新了used数组,所以在为当前节点染色之前,需要先把前i-1个节点的颜色获取到(就是sln[i-1])
之后把这些颜色的标志符置位true
import java.util.*;
/**
* @Description 我们写代码,靠的是技术(狗头)
* @auther admin
* @create 2020-06-21 16:45
*/
class Solution1042 {
public int[] gardenNoAdj(int N, int[][] paths) {
Map<Integer, Vector<Integer>> map = new HashMap<>();
/**
* 可以假设有4个集合 用来表示这个集合里面的花坛将会用Integer这个颜色来染
* 如果花坛之间两两有边,则表示他们不能放到同一个集合里面
*/
for (int i = 1; i <= N; i++) {
map.put(i, new Vector<>());
}
/**
* 先默认将一号花坛加入集合1中
*/
int[] sln = new int[N];
if (N < 4) {
for (int i = 0; i < N; i++) sln[i] = i + 1;
return sln;
}
/**
* 判断颜色1-4是否被使用过
*/
for (int i = 0; i < paths.length; i++) {
/**
* 表示paths[j][0]和paths[j][1]中的起点或者终点包含i
* 如果i为起点 则不能放到终点对应的那个集合
* 反之也是
*
* 将path中的这些点加到刚刚的map中
*/
map.get(paths[i][0]).add(paths[i][1]);
map.get(paths[i][1]).add(paths[i][0]);
}
/**
* 开始染色
* 1已经染过了 为1
* 所以从2开始染
*/
sln[0] = 1;
for(int i = 2; i <= N; i++) {
boolean[] used = new boolean[5];
for (int index:map.get(i)){
if(index<i)used[sln[index-1]] = true;
}
for(int color = 1;color<=4;color++){
if(!used[color]){
sln[i-1] = color;break;
}
}
}
return sln;
}
public static void main(String[] args) {
Solution1042 solution1042 = new Solution1042();
int[] a = solution1042.gardenNoAdj(5,new int[][]{{4,1},{4,2},{4,3},{2,5},{1,2},{1,5}});
for(int i = 0;i<4;i++){
System.out.println(a[i]);
}
}
}