美文网首页
额外 - 杭电 - 畅通工程

额外 - 杭电 - 畅通工程

作者: 1f872d1e3817 | 来源:发表于2019-01-21 16:05 被阅读0次

题目:畅通工程

本质:计算无向图的连通分量

输入:int N = 城镇数
list input_list = 城镇之间的联通关系

方法1:并查集

class FindUnion:
    def __init__(self, n):
        self.pre = [i for i in range(n + 1)]
        self.rank = [1 for i in range(n + 1)]

    def find(self, i):
        if self.pre[i] == i:
            return i
        self.pre[i] = self.find(self.pre[i])
        return self.pre[i]

    def join(self, x, y):
        root_x = self.find(x)
        root_y = self.find(y)
        if root_x == root_y:
            return
        if self.rank[root_x] > self.rank[root_y]:
            self.pre[root_y] = root_x
        else:
            if self.rank[root_x] == self.rank[root_y]:
                self.rank[root_y] += 1
            self.pre[root_x] = root_y

    def handle_input(self, _list):
        for i in _list:
            self.join(i[0], i[1])

    def calc_how_many_road_we_need(self):
        repeat_count = 0
        already_appeared = {}
        for item in self.pre[1:]:
            if item not in already_appeared:
                repeat_count += 1
                already_appeared[item] = True
        return repeat_count - 1


if __name__ == "__main__":
    n = 4
    input_list = [[1, 3], [4, 3]]
    fu = FindUnion(n)
    fu.handle_input(input_list)
    print(fu.calc_how_many_road_we_need())

方法2:DFS

class Graph:
    def __init__(self, _n, _list):
        self.visit = [0 for _ in range(_n)]
        self.maze = []
        for x in range(_n):
            temp = []
            for y in range(_n):
                if x == y:
                    temp.append(1)
                else:
                    temp.append(0)
            self.maze.append(temp)
        for i in _list:
            self.maze[i[0]-1][i[1]-1] = 1
            self.maze[i[1]-1][i[0]-1] = 1
        print(self.maze)

    def dfs(self, i):
        if self.visit[i] == 1:
            return
        self.visit[i] = 1
        for j in range(len(self.maze)):
            if self.maze[i][j]:
                self.dfs(j)

    def travel(self):
        count = 0
        for i in range(len(self.maze)):
            if self.visit[i] == 0:
                self.dfs(i)
                count += 1
        return count - 1


if __name__ == "__main__":
    n = 4
    input_list = [[1, 3], [3, 4]]
    g = Graph(n, input_list)
    print(g.travel())

相关文章

  • 额外 - 杭电 - 畅通工程

    题目:畅通工程 本质:计算无向图的连通分量 输入:int N = 城镇数list input_list = 城镇...

  • 杭电acm1232 畅通工程

    畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Lim...

  • 杭电acm1863 畅通工程

    畅通工程 Time Limit: 1000/1000 MS (Java/Others) Memory Lim...

  • 杭电acm1874 畅通工程续

    畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Li...

  • 杭电oj-1233-还是畅通工程

    题目链接:还是畅通工程prim算法原理注意点:本文针对的题目还是畅通工程中每两个顶点间都是有一条非零的连接,即共n...

  • 并查集

    CSDN上的并查集讲解的非常清楚,这里只做补充。 CSDN上的并查集讲解 这是杭电OJ上对应的题目:畅通工程 关于...

  • 畅通工程

    解析 题面中描述的是一个实际的问题, 但该问题可以被抽象成在一个图上查找连通分量(彼此连通的结点集合)的个数,我们...

  • HDU 1232 - 畅通工程

    畅通工程 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标...

  • 杭电助手

    杭电助手(服务号hduhelp,订阅号hduhelper)是隶属于杭州电子科技大学党委学工部的校级组织,我们有前端...

  • 杭电2015

    这道题看起来不复杂,但做起来还是挺费工夫的。里面要用很多的循环结构,很容易在些小地方出错。我就是因为那些小问题而搞...

网友评论

      本文标题:额外 - 杭电 - 畅通工程

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