結果
問題 | No.1640 簡単な色塗り |
ユーザー |
|
提出日時 | 2022-09-22 11:02:37 |
言語 | Python3 (3.13.1 + numpy 2.2.1 + scipy 1.14.1) |
結果 |
AC
|
実行時間 | 1,521 ms / 2,000 ms |
コード長 | 2,075 bytes |
コンパイル時間 | 101 ms |
コンパイル使用メモリ | 12,800 KB |
実行使用メモリ | 132,648 KB |
最終ジャッジ日時 | 2024-12-22 04:46:30 |
合計ジャッジ時間 | 42,746 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 51 TLE * 2 |
ソースコード
n=int(input())g=[[]for _ in range(n)]par = [-1]*ndef root(x):if par[x]<0:return xr=root(par[x])par[x]=rreturn rdef same(x,y):return root(x)==root(y)def merge(x, y):if same(x,y):returnx=root(x)y=root(y)if par[x]>par[y]:x,y=y,xpar[x]+=par[y]par[y]=xfor i in range(n):a,b=map(int,input().split())a-=1b-=1g[a].append([b,i])g[b].append([a,i])merge(a, b)# 辺の片方だけ塗れるとすると# 全ての連結成分においてV=Eとなる必要がある# V==Eの時、一つ余分な辺がある。V!=E-1の時、木だが木は条件を満たせない。(葉から塗ろうとも頂点が余る)# V==Eの時行けることはV!=E-1の時から分かる# この時塗る順番だが、葉から塗って削っていくと、最後に閉路が残る。閉路の順番は任意である# あとは辺のインデックスを保持しておいてvss=[[]for _ in range(n)]for i in range(n):vss[root(i)].append(i)ans=[0]*ndeg=[0]*n # 入次数used=[0]*n # 辺を使ったかfor vs in vss:if vs==[]:continue# V==Eかどうか確認V=len(vs)ids=set()for v in vs:for nv,i in g[v]:ids.add(i)deg[nv]+=1E=len(ids)if V!=E:print('No')exit()q=[]for v in vs:if deg[v]==1: # こいつは真っ先に塗らないとだめq.append(v)for v in q:for nv, i in g[v]:if used[i]==0:used[i]=1ans[i]=vdeg[nv]-=1if deg[nv]==1:q.append(nv)# 最後に余った閉路for s in vs:if deg[s]>1:# cycler=[s]for v in r:for nv, i in g[v]:if used[i]==0:used[i]=1ans[i]=vr.append(nv)breakbreakprint('Yes')for x in ans:print(x+1)