Problem p02762 (python)

Fixed submission:
slct='D'

# C
if slct=='C':
    N,M=map(int,input().split())
    cnd=[tuple(int(i) for i in input().split()) for j in range(M)]
    ans=-1
    for n in range(10**N):
        # print(n)
        flag=True
        n_str=str(n)
        if len(n_str)!= N:
            continue
        for s,c in cnd:
            if n_str[s-1]!=str(c):
                # print(n_str[s-1],c)
                flag=False
                break
        if flag:
            ans=n
            break
    print(ans)

# D
elif slct=='D':
    N,M,K=map(int,input().split())
    
    par=[-1 for _ in range(N)]
    # 負なら根でabsがその根の属する木のサイズ
    # 正ならその値が親

    def root(n):
        if par[n]<0:
            return n
        else:
            par[n]=root(par[n]) # 親の根に繋ぎなおす
            return par[n]
    
    def unite(m,n):
        x=root(m)
        y=root(n)
        if x==y: # 同じ木にいる
            return
        if par[x]>par[y]: # yのサイズの方が大きい:swap
            x,y=y,x 
        par[x]+=par[y] # サイズの大きいxにくっつける: サイズを記録
        par[y]=x 

    def issame(m,n):
        return root(m)==root(n)
    
    def size(n): # nの属する木のsizeを取得
        return -par[root(n)]
    
    # iの求めたい値 = size(i) -直接の友達関係の数 -iの木上でブロック関係にある数 -1
    # 直接の友達関係ならお互いに同じ木にいる
    ans=[-1 for _ in range(N)] # 自分の分: -1
    
    for _ in range(M): #木達の構築
        A,B=map(int,input().split())
        unite(A-1,B-1)
        # 直接の友達関係を引く
        ans[A-1]-=1
        ans[B-1]-=1
    for _ in range(K): # ブロック関係にあるかどうか
        C,D=map(int,input().split())
        #同じ木でなければ答えに関係ない,同じ木にいるなら引く
        if issame(C-1,D-1):
            ans[C-1]-=1
            ans[D-1]-=1
    for i in range(N): 
        print(ans[i]+size(i))

Buggy submission (verdict: Runtime Error):
slct='D'

# C
if slct=='C':
    N,M=map(int,input().split())
    cnd=[tuple(int(i) for i in input().split()) for j in range(M)]
    ans=-1
    for n in range(10**N):
        # print(n)
        flag=True
        n_str=str(n)
        if len(n_str)!= N:
            continue
        for s,c in cnd:
            if n_str[s-1]!=str(c):
                # print(n_str[s-1],c)
                flag=False
                break
        if flag:
            ans=n
            break
    print(ans)
# D
elif slct=='D':
    # 友達関係の無向グラフを作る
    #
    N,M,K=map(int,input().split())
    blk=[[] for _ in range(N)]
    fnd=[[] for _ in range(N)]

    pnt=[i for i in range(N)]

    def root(n):
        if pnt[n]==n:
            return n
        else:
            pnt[n]=root(pnt[n])
            return pnt[n]
    
    def issame(m,n):
        return root(m)==root(n)
    
    def union(m,n):
        if issame(m,n):
            pass
        else:
            pnt[root(m)]=root(n)
        
    for _ in range(M):
        A,B=map(int,input().split())
        fnd[A-1].append(B-1)
        fnd[B-1].append(A-1)
        union(A-1,B-1)
    for _ in range(K):
        C,D=map(int,input().split())
        blk[C-1].append(D-1)
        blk[D-1].append(C-1)

    for i in range(N):
        ans=0
        for j in range(N):
            if i==j: # 自分
                continue
            if i in blk[j]: #ブロック関係である
                continue
            if i in fnd[j]: # 直接の友達関係である
                continue
            if issame(i,j): # 間接の友達関係である
                ans+=1
        print(ans)