
class Solution:def sortItems(self, n: int, m: int, group: List[int], beforeItems: List[List[int]]) -> List[int]:# 同一小组的项目,排序后在列表中彼此相邻 -> 组间topo# 全局topo = 组间topo + 组内topo# step1: 补充分组信息groupIndex2groupMember = defaultdict(list)for i in range(n):if group[i] == -1:group[i] = mm += 1groupIndex2groupMember[group[i]].append(i)# step2: 组间和组内建图inter = defaultdict(list)inner = defaultdict(lambda: defaultdict(list))for i in range(n):for j in beforeItems[i]:# j -> iif group[i] == group[j]: # 组内inner[group[i]][j].append(i)else: # 组间inter[group[j]].append(group[i])# step3: topo排序checkdef check_topo(g, nodes):indeg = defaultdict(int)for x in g:for y in g[x]: # y入度+1indeg[y] += 1q = [i for i in nodes if indeg[i] == 0]topo_ans = q[:]while q:new_q = []for qq in q:for next_node in g[qq]:indeg[next_node] -= 1if indeg[next_node] == 0:topo_ans.append(next_node)new_q.append(next_node)q = new_q#print(topo_ans)return topo_ans if len(topo_ans) == len(nodes) else []# step4: 组间checkinter_topo = check_topo(inter, list(set(group))) # 不能用range(m), 可能中间有空位if len(inter_topo) == 0:return []# step5: 组内check, 逐一checkwhole_topo = []for idx in inter_topo: # 按照inter_topo取出group的idx#print(idx, inner[idx], groupIndex2groupMember[idx])inner_topo = check_topo(inner[idx], groupIndex2groupMember[idx])#print(inner_topo)if len(inner_topo) == 0:return []whole_topo.extend(inner_topo)return whole_topo
上一篇:Mysql详细安装步骤
下一篇:我应该是懂居家办公的吧?