解法
就是有个无向图,保证只有一个环,求每个点到环的距离
- 首先找到环上的点
- 从环上的点开始dfs
找环有很多种方法,DFS,BFS还有拓扑都可以找
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from collections import defaultdict,deque
def solve(n,edges):
circle = set()
ans = [0] * (n + 1)
def BFS():
dis = {}
bfs = deque([(0, 1)])
dis[1] = 0
f = defaultdict(int)
f[1] = 1
while bfs:
d, i = bfs.popleft()
for j in edges[i]:
if j not in dis:
bfs.append((d + 1, j))
dis[j] = d + 1
f[j] = i
elif j!=f[i]:
while i!=j:
if dis[i]>dis[j]:
circle.add(i)
i = f[i]
else:
circle.add(j)
j = f[j]
circle.add(i)
return
BFS()
visited = set()
d = 0
while circle:
d += 1
visited |= circle
new = set()
for i in circle:
for j in edges[i]:
if j not in visited:
ans[j] = d
new.add(j)
circle = new
return ans[1:]
if __name__ == '__main__':
t = input()
for round in xrange(1,t+1):
n = input()
edges = defaultdict(set)
for _ in xrange(n):
x,y = map(int,raw_input().split())
edges[x].add(y)
edges[y].add(x)
print "Case #%d: %s" % (round," ".join(map(str,solve(n,edges))))