2025年6月18日 星期三

Union-Find sample

 # 找組長(含路徑壓縮)

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

沒有留言:

張貼留言