# 找組長(含路徑壓縮)
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
# 合併兩個人的隊伍
def union(x, y):
parent[find(y)] = find(x)
# 學生名單
students = ['Amy', 'Bob', 'Carol', 'David', 'Eva', 'Frank', 'Grace', 'Helen']
parent = list(range(len(students))) # 每個人一開始是自己的組長
print("\n學生與編號:")
for name, idx in zip(students, parent):
print(f" {name}(編號 {idx})")
# 已知的組隊情況
print("\n組隊情況:")
teams = [
(0, 1, "Amy 和 Bob 組隊"),
(1, 2, "Bob 和 Carol 組隊"),
(3, 4, "David 和 Eva 組隊"),
(5, 6, "Frank 和 Grace 組隊")
]
for i, j, desc in teams:
print(f" {desc}")
union(i, j)
# 統計各隊成員
groups = {}
for i in range(len(students)):
leader = find(i)
if leader not in groups:
groups[leader] = []
groups[leader].append(students[i])
# 顯示結果
print("\n各隊成員:")
for idx, members in enumerate(groups.values(), 1):
print(f" 隊伍 {idx}:{'、'.join(members)}")
output:
學生與編號:
Amy(編號 0)
Bob(編號 1)
Carol(編號 2)
David(編號 3)
Eva(編號 4)
Frank(編號 5)
Grace(編號 6)
Helen(編號 7)
組隊情況:
Amy 和 Bob 組隊
Bob 和 Carol 組隊
David 和 Eva 組隊
Frank 和 Grace 組隊
各隊成員:
隊伍 1:Amy、Bob、Carol
隊伍 2:David、Eva
隊伍 3:Frank、Grace
隊伍 4:Helen
沒有留言:
張貼留言