名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。アクセス解析のためGAを利用、Googleに情報を送信しています。商品紹介のためAmazonアフィリエイトを利用、Amazonに情報を送信しています。記事に関しては私が書いていない引用文を除いて自由にご利用ください。

ATC 001 B - Union Find(2015/06/06)

問題

Submission #421264 - AtCoder Typical Contest 001 | AtCoder

アルゴリズムの解説はもうスライド見てくださいっていう(

www.slideshare.net

こっちの方はPythonでもうまく行ったので,特に無いですね.
ただし本番ではfindメソッド経路圧縮の関係か,最初テーブルの中身を直接比較するisSameメソッドでの処理でREが発生しました.
ちゃんとfindメソッド使って経路圧縮して比較しましょう.

N, Q = map(int, input().split())
queries = [list(map(int, input().split())) for _ in range(Q)]
 
unilist = [i for i in range(N)]
 
def find(x):
    if x == unilist[x]:
        return x
    else:
        unilist[x] = find(unilist[x])
        return unilist[x]
 
def union(x, y):
    s1, s2 = find(x), find(y)
    if s1 != s2:
        unilist[s2] = s1
 
def isSame(x, y):
    return find(x) == find(y)
 
for query in queries:
    if query[0] == 0:
        union(query[1], query[2])
    else:
        print("Yes" if isSame(query[1], query[2]) else "No")