LeetCode--1042. 不鄰接植花

碼畜也有夢想發表於2020-10-31

在這裡插入圖片描述
——————————————————————————————————————————————————————

把花的種類當成顏色進行染色。

import java.util.Arrays;

class Solution {
	int N, M;//頂點數,邊數
	int[] h;
	int[] e;
	int[] ne;
	int idx;
	int[] color;//color[i]:頂點i的顏色,i從1開始
	int[] res;//返回的最終結果
	
    public int[] gardenNoAdj(int n, int[][] paths) {
    	N = n;
    	M = paths.length;
    	h = new int[N + 10];
    	color = new int[N + 10];
    	res = new int[n];
    	e = new int[2 * M + 10];//無向圖,預留兩倍的邊數
    	ne = new int[2 * M + 10];
    	Arrays.fill(h, -1);
    	for (int i = 0; i < paths.length; i++) {
			int a = paths[i][0];
			int b = paths[i][1];
			add(a, b);
            add(b, a);
		}
    	for (int i = 1; i <= n; i++) {//挨個遍歷頂點i
    		boolean[] used = new boolean[5];//used[i]表示顏色i被用過了
    		for (int j = h[i]; j != -1; j = ne[j]) {//遍歷頂點i的鄰居
				int k = e[j];
                //System.out.println(i + "的鄰居:" + k);
                used[color[k]] = true;//將頂點i所有鄰居的顏色標記為已使用
			}
    		for (int c = 1; c <= 4; c++) {//從沒使用的顏色中挑一個給頂點i塗上
				if (!used[c]) {
					color[i] = c;
					used[c] = true;
				}
			}
		}
    	for (int i = 1; i <= n; i++) {//下標從1開始轉為下標從0開始
			res[i - 1] = color[i];
		}
    	return res;
    }

	private void add(int a, int b) {
		e[idx] = b;
		ne[idx] = h[a];
		h[a] = idx++;
	}
}

在這裡插入圖片描述