結果

問題 No.2630 Colorful Vertices and Cheapest Paths
コンテスト
ユーザー flippergo
提出日時 2026-08-22 09:27:32
言語 PyPy3
(7.3.17)
コンパイル:
pypy3 -mpy_compile _filename_
実行:
pypy3 _filename_
結果
AC  
実行時間 1,747 ms / 2,500 ms
+ 368µs
コード長 1,264 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 2,065 ms
コンパイル使用メモリ 95,856 KB
実行使用メモリ 245,800 KB
最終ジャッジ日時 2026-08-22 09:28:05
合計ジャッジ時間 28,974 ms
ジャッジサーバーID
(参考情報)
judge2_0 / judge3_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 22
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys
sys.setrecursionlimit(10000+10)
INFTY = 10**10+10
N,M = map(int,input().split())
A = [tuple(map(int,input().split())) for _ in range(M)]
C = [-1]+list(map(int,input().split()))
def r_find(i):
    if T[i][0]==i:
        return i
    return r_find(T[i][0])
def r_union(i,j):
    ri = r_find(i)
    rj = r_find(j)
    if ri==rj:return
    if T[ri][1]>T[rj][1]:
        T[rj][0] = ri
    elif T[rj][1]>T[ri][1]:
        T[ri][0] = rj
    else:
        T[rj][0] = ri
        T[ri][1] += 1
D = {}
for i in range(1<<10):
    T = [[j,0] for j in range(N+1)]
    for j in range(M):
        u,v = A[j]
        if (i>>(C[u]-1) & 1) and (i>>(C[v]-1) & 1):
            r_union(u,v)
    col = [-1]*(N+1)
    cnt = 0
    for u in range(1,N+1):
        ru = r_find(u)
        if col[ru]<0:
            col[ru] = cnt
            cnt += 1
        col[u] = col[ru]
    D[i] = col[:]
W = list(map(int,input().split()))
Q = int(input())
for _ in range(Q):
    u,v = map(int,input().split())
    ans = INFTY
    for i in range(1<<10):
        if D[i][u]==D[i][v]:
            cnt = 0
            for k in range(10):
                if (i>>k) & 1:
                    cnt += W[k]
            ans = min(ans,cnt)
    if ans>=INFTY:
        print(-1)
    else:
        print(ans)
0