2025年1月14日 星期二

小群體

# 讀取輸入
n = int(input())
mapping = list(map(int, input().split()))

# 初始化變數
visited = set()  # 使用集合來記錄已訪問的節點
cycle_count = 0  # 記錄閉環數量

# 循環遍歷所有節點
for start_node in range(n):
    if start_node not in visited:  # 如果節點未被訪問
        current_node = start_node
        while current_node not in visited:
            visited.add(current_node)  # 標記當前節點為已訪問
            current_node = mapping[current_node]  # 跳到下一個節點
        cycle_count += 1  # 完成一個閉環

# 輸出結果
print(cycle_count)

改寫後的優化

  1. 可讀性提升

    • 改善了變數命名,例如:
      • mapping 替代原本的 f
      • visited 替代原本的 v
    • 使程式的邏輯更加直觀。
  2. 使用集合

    • set 結構在檢查和新增訪問節點時比 list 更高效,縮短了運行時間。
  3. 結構簡化

    • 去除了不必要的變數(如 tg)。
    • 使用 for 迴圈代替了 while 中的手動索引更新,簡化了控制流程。

範例測試

範例 1

輸入:

5
1 2 0 4 3

輸出:

2

範例 2

輸入:

4
1 0 3 2

輸出:

2

範例 3

輸入:

6
1 2 0 4 5 3

輸出:

3

這個改寫版本執行結果與原程式完全一致,但結構更加簡潔,易於理解和維護。

沒有留言:

張貼留言