[白俊]1717号集合の表現


質問リンク

  • https://www.acmicpc.net/problem/1717
  • 問題の説明


  • 初期{0}、{1}、{2}、...n+1個の集合をそれぞれ構成する

  • 0、a、bの場合、aの属する集合とbの属する集合を加算

  • 1、a、bの場合、aが属する集合とbが属する集合とが同一か否かを出力する
  • エラーの回答

  • そのまま実施
  • タイムアウト
  • 合計->エッジ接続->DFS
  • タイムアウト
  • の特定の座標を見つけてこそ、再ホームを終了することができますか?
  • 本が同じ場合、同じ集合
  • 対草


  • 各ノードに複数の親ノードが格納されるリストを作成します.

  • 1、a、bの場合
  • aおよびbのルートノード
  • をそれぞれ検索する
  • であればyes、そうでなければno

  • 0、a、bの場合

  • aとbのルートノードを別々に検索

  • 場合によって
  • aルートノードの親ノード=bのルートノード(順序なし)
  • Unionコース

  • 013結果
  • 076結果
  • 0 7結果
  • 042結果
  • コード#コード#

    import sys
    
    
    def union(a, b):
        ra = get_root(a)
        rb = get_root(b)
        if ra != rb:
            parent[rb] = ra
    
    
    def get_root(x):
        if parent[x] != x:
            parent[x] = get_root(parent[x])
        return parent[x]
    
    
    sys.setrecursionlimit(10000)
    ipt = sys.stdin.readline
    opt = sys.stdout.write
    n, m = map(int, ipt().split())
    parent = list(range(n+1))
    for _ in range(m):
        check, a, b = map(int, ipt().split())
        if a > b:
            a, b = b, a
        if check:
            ra = get_root(a)
            rb = get_root(b)
            if ra == rb:
                opt('yes\n')
            else:
                opt('no\n')
        else:
            union(a, b)