美文网首页
寻找无向图中的环

寻找无向图中的环

作者: madao756 | 来源:发表于2020-03-18 17:51 被阅读0次

0X00 模板题

Planet Distance

from collections import deque


def solve(graph):
    degrees = {}
    deq = deque()

    # 找到所有度为 1 的点
    for k, v in graph.items():
        degrees[k] = len(v)
        if len(v) == 1:
            deq.append(k)

    # print("deq", deq)
    visited = set(deq)

    # 拓扑排序找到环
    while len(deq) > 0:
        size = len(deq)
        while size > 0:
            size -= 1
            n = deq.popleft()
            for n1 in graph[n]:
                if n1 in visited: continue
                degrees[n1] -= 1
                if degrees[n1] == 1:
                    visited.add(n1)
                    deq.append(n1)

    # print("degrees", degrees)

    circles = deque([k for k, v in degrees.items() if v != 1])
    # print("circles", circles)
    visited = set(circles)

    # 用 bfs 计算距离
    dists = [""] * len(graph)
    dis = 0
    while len(circles) > 0:
        size = len(circles)
        while size > 0:
            size -= 1
            n = circles.popleft()
            dists[int(n) - 1] = str(dis)
            for n1 in graph[n]:
                if n1 in visited:
                    continue
                visited.add(n1)
                circles.append(n1)
        dis += 1

    return dists


def createGraph(edgeNum):
    graph = {}
    for i in range(edgeNum):
        n1, n2 = input().strip().split()
        if n1 not in graph and n2 in graph:
            graph[n1] = [n2]
            graph[n2].append(n1)
        elif n2 not in graph and n1 in graph:
            graph[n2] = [n1]
            graph[n1].append(n2)
        elif n2 in graph and n1 in graph:
            graph[n2].append(n1)
            graph[n1].append(n2)
        else:
            graph[n2] = [n1]
            graph[n1] = [n2]
    return graph


T = int(input())
for t in range(T):
    graph = createGraph(int(input()))
    print("Case #{}: {}".format(t + 1, " ".join(solve(graph))))

输入:

1
6
1 2
2 3
3 4
4 5
5 6
4 6

主要看这一段:

from collections import deque

graph = {}

degrees = {}
deq = deque()

# 找到所有度为 1 的点
for k, v in graph.items():
    degrees[k] = len(v)
    if len(v) == 1:
        deq.append(k)

# print("deq", deq)
visited = set(deq)

# 拓扑排序找到环
while len(deq) > 0:
    size = len(deq)
    while size > 0:
        size -= 1
        n = deq.popleft()
        for n1 in graph[n]:
            if n1 in visited: continue
            degrees[n1] -= 1
            if degrees[n1] == 1:
                visited.add(n1)
                deq.append(n1)
circles = deque([k for k, v in degrees.items() if v != 1])

注意一定要加 visited

相关文章

  • 寻找无向图中的环

    0X00 模板题 Planet Distance 输入: 主要看这一段: 注意一定要加 visited

  • 图的环检测

    一、无向图的环判断 1.1 环的定义 此处的环不包含自环和平行边。 无向图中环的示意图如下所示: 上图中,0-6-...

  • 6. 拓扑排序

    一些概念 有向无环图 : 一个有向图中不存在环,则称为有向无环图,简称 DAG AOV (Activity on ...

  • 拓扑排序

    1、介绍 拓扑排序主要应用于有向无环图,所谓的有向无环图指的是,图中没有环。如图: 拓扑排序是一个有向无环图的所有...

  • 无/有向图判环

    无向图寻找环的方法:(一) DFSDFS搜索图,图中的边只可能是树边或反向边,一旦发现反向边,则表明存在环。该算法...

  • 写给媳妇儿的算法(十三)——贝尔曼-福德算法

    我们知道,狄克斯特拉算法可以用于寻找权值为正的有向无环图的最短路径。如果我们遇到图中某些边的权值为负,我们应该如何...

  • 任务调度-DAG和Oozie基础

    本文主要内容 有向无环图 拓扑排序 Oozie 有向无环图 什么是有向无环图 有向无环图(Directed Acy...

  • DAG上的动态规划「二」

    有向无环图DAG算法中有时称有向无环图为DAG ( Directed Acyclic Graph)。所谓有向无环图...

  • DAG上的动态规划「一」

    有向无环图DAG算法中有时称有向无环图为DAG ( Directed Acyclic Graph)。所谓有向无环图...

  • 山神带你入门区块链第四十五弹:可扩展性——DAG

    DAG 是有向无环图(Directed Acyclic Graph)的缩写,什么叫做有向无环呢?有向无环指的是一种...

网友评论

      本文标题:寻找无向图中的环

      本文链接:https://www.haomeiwen.com/subject/rhucyhtx.html