【Kickstart】2018 Round C - Planet Distance

解法

就是有个无向图,保证只有一个环,求每个点到环的距离

  1. 首先找到环上的点
  2. 从环上的点开始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))))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值