結果
| 問題 |
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]*n
def root(x):
if par[x]<0:return x
r=root(par[x])
par[x]=r
return r
def same(x,y):
return root(x)==root(y)
def merge(x, y):
if same(x,y):return
x=root(x)
y=root(y)
if par[x]>par[y]:
x,y=y,x
par[x]+=par[y]
par[y]=x
for i in range(n):
a,b=map(int,input().split())
a-=1
b-=1
g[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]*n
deg=[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]+=1
E=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]=1
ans[i]=v
deg[nv]-=1
if deg[nv]==1:
q.append(nv)
# 最後に余った閉路
for s in vs:
if deg[s]>1:
# cycle
r=[s]
for v in r:
for nv, i in g[v]:
if used[i]==0:
used[i]=1
ans[i]=v
r.append(nv)
break
break
print('Yes')
for x in ans:
print(x+1)