結果

問題 No.3580 二成分の和
コンテスト
ユーザー kidodesu
提出日時 2026-07-04 00:51:22
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 52 ms / 2,000 ms
コード長 2,510 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 336 ms
コンパイル使用メモリ 85,376 KB
実行使用メモリ 69,888 KB
最終ジャッジ日時 2026-07-04 00:51:28
合計ジャッジ時間 2,865 ms
ジャッジサーバーID
(参考情報)
judge1_0 / judge2_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 30
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

def main():
    n, m, B = list(map(int, input().split()))
    node = [[] for _ in range(n)]
    node_ = [[] for _ in range(n)]
    for _ in range(m):
        u, v, c = list(map(int, input().split()))
        node[u-1].append((v-1, c))
        node[v-1].append((u-1, c))
        node_[u-1].append((v-1, c))
        node_[v-1].append((u-1, c))
    Ans = [-1] * n
    for s in range(n):
        if Ans[s] != -1: continue
        D = {s: 0}
        S = [(s, 0)]
        X = []
        while S:
            now = S[-1][0]
            if not node_[now]:
                S.pop()
            else:
                nxt, c = node_[now].pop()
                if not nxt in D:
                    D[nxt] = D[now]^1
                    S.append((nxt, c))
                elif D[nxt] == D[now]:
                    X = [(nxt, c)]
                    while S[-1][0] != nxt:
                        X.append(S.pop())
                    break
        if X:
            s0 = X[0][0]
            d_sum = 0
            for _, c in X[1::2]:
                d_sum += c
            d_sum %= B
            c_sum = sum([c for _, c in X]) % B
            if B % 2:
                c_s0s = [(c_sum * pow(2, -1, B)-d_sum) % B]
            elif c_sum % 2:
                return []
            else:
                c_s0s = [(c_sum-d_sum)%B, ((c_sum+B)//2-d_sum)%B]
            for c_s0 in c_s0s:
                D = {s0: c_s0}
                S = [s0]
                f = 1
                while S and f:
                    now = S.pop()
                    for nxt, c in node[now]:
                        if nxt in D:
                            if (D[nxt]+D[now]) % B != c:
                                f = 0
                                break
                        else:
                            D[nxt] = (c-D[now]) % B
                            S.append(nxt)
                if f:
                    for now in D:
                        Ans[now] = D[now]
                    break
            else:
                return []
        else:
            Ans[s] = 0
            S = [s]
            while S:
                now = S.pop()
                for nxt, c in node[now]:
                    if Ans[nxt] != -1:
                        if (Ans[nxt]+Ans[now]) % B != c:
                            return []
                    else:
                        Ans[nxt] = (c-Ans[now]) % B
                        S.append(nxt)
    return Ans

Ans = main()
if Ans:
    print("Yes")
    print(*Ans)
else:
    print("No")
0