ABC146 D - Coloring Edges on Tree

AtCoder Beginner Contest 146
atcoder.jp

解法

 まず、使用する色の数はすべての頂点の次数のうち最大のものである(次数とは頂点から出る辺の数である)。
 次に、色の塗分けは幅優先探索を使って行う。具体的には任意の頂点を根として、子となる頂点との間の辺に1から順番に色を与えていく。このとき、根以外の頂点については1つの親が存在するため、親とは何番の色の辺でつながっているかを管理しておき、子となる頂点への色分けにはその色を使わないようにする必要がある。

ソースコード(Python3)

from sys import stdin
from collections import deque
def main():
    #入力
    readline=stdin.readline
    N=int(readline())
    g=[[] for _ in range(N)]
    AB=[]
    for _ in range(N-1):
        a,b=map(lambda x:int(x)-1,readline().split())
        g[a].append(b)
        g[b].append(a)
        AB.append(str(a)+" "+str(b))

    link=[0]*N
    que=deque([0])
    is_searched=[False]*N
    is_searched[0]=True
    K=0
    ans=dict()
    #bfs
    while len(que)>=1:
        now=que.popleft()
        color=1
        for x in g[now]:
            if is_searched[x]:
                continue
            else:
                is_searched[x]=True
                que.append(x)
                if color==link[now]:
                    color+=1
                link[x]=color
                ans[str(min(now,x))+" "+str(max(now,x))]=color
                color+=1
        color-=1
        K=max(K,color)

    #出力
    print(K)
    for key in AB:
        print(ans[key])
        
if __name__=="__main__":
    main()