本文共 1821 字,大约阅读时间需要 6 分钟。
为了解决这个问题,我们需要找到最小的k,使得当警方打击掉编号1到k的犯罪团伙后,剩下的犯罪团伙被分割成若干个较小的集团,并且这些集团的最大危险程度不超过n/2。
import sysfrom collections import dequedef main(): n = int(sys.stdin.readline()) adj = [[] for _ in range(n + 1)] for i in range(1, n + 1): parts = list(map(int, sys.stdin.readline().split())) m = parts[0] adj[i] = parts[1:] for k in range(1, n + 1): S = set(range(k + 1, n + 1)) parent = {i: i for i in S} size = {i: 1 for i in S} def find(u): while parent[u] != u: parent[u] = parent[parent[u]] # 路径压缩 u = parent[u] return u def union(u, v): u_root = find(u) v_root = find(v) if u_root == v_root: return if size[u_root] < size[v_root]: parent[u_root] = v_root size[v_root] += size[u_root] else: parent[v_root] = u_root size[u_root] += size[v_root] for i in S: for j in adj[i]: if j in S: union(i, j) max_size = 0 for i in S: root = find(i) current_size = size[root] if current_size > max_size: max_size = current_size if max_size <= n // 2: print(k) returnif __name__ == "__main__": main() 这个方法通过逐步处理每个k,确保在最少的时间内找到最小的k,使得剩下的团伙满足条件,保证了高效性和正确性。
转载地址:http://vsaa.baihongyu.com/