有 N 个花园,按从 1 到 N 标记。在每个花园中,你打算种下四种花之一。
paths[i] = [x, y] 描述了花园 x 到花园 y 的双向路径。
另外,没有花园有 3 条以上的路径可以进入或者离开。
你需要为每个花园选择一种花,使得通过路径相连的任何两个花园中的花的种类互不相同。
以数组形式返回选择的方案作为答案 answer,其中 answer[i] 为在第 (i+1) 个花园中种植的花的种类。花的种类用 1, 2, 3, 4 表示。保证存在答案。
示例 1:
输入:N = 3, paths = [[1,2],[2,3],[3,1]]
输出:[1,2,3]
示例 2:
输入:N = 4, paths = [[1,2],[3,4]]
输出:[1,2,1,2]
示例 3:
输入:N = 4, paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4]]
输出:[1,2,3,4]
提示:
1 <= N <= 10000
0 <= paths.size <= 20000
不存在花园有 4 条或者更多路径可以进入或离开。
保证存在答案。
难度 :简单
关键点:共有4种花可种,而每个花园最多只有三条边,这意味着一定有解,且解可有多种。使用贪心算法
感受下Python的优雅和简洁
N = 7
paths = [[1,2],[2,3],[3,4],[4,1],[1,3],[2,4],[5,6],[5,7],[6,7]]
res = [0] * (N + 1)
G = [ [] for _ in range(N + 1)]
# 使用邻接表存放每个花园与其它花园连接的信息
for x ,y in paths:
G[x].append(y)
G[y].append(x)
for i in range(1,N +1):
## 关键代码:
#1.算出每个花园相领的花园种了哪些花得出
#2.得出每个花园可种的花有哪些
#3.任选一种种植
res[i] = ({1,2,3,4} - {res[j] for j in G[i]}).pop()
# 结果
print(res[1:]