图论题之并查集的应用

  1. 寻找存在的路线
    题目描述
    给定一个包含 n 个节点的无向图中,节点编号从 1 到 n (含 1 和 n )。

你的任务是判断是否有一条从节点 source 出发到节点 destination 的路径存在。

输入描述
第一行包含两个正整数 N 和 M,N 代表节点的个数,M 代表边的个数。

后续 M 行,每行两个正整数 s 和 t,代表从节点 s 与节点 t 之间有一条边。

最后一行包含两个正整数,代表起始节点 source 和目标节点 destination。

输出描述
输出一个整数,代表是否存在从节点 source 到节点 destination 的路径。如果存在,输出 1;否则,输出 0。
输入示例
5 4
1 2
1 3
2 4
3 4
1 4
输出示例
1
提示信息

数据范围:

1 <= M, N <= 100。
这道题可以用暴力搜索,不过时间较长,会超时,对于这种判断路径是否连通的题目我们最好使用并查集来完成
解题步骤如下

点击查看代码
class UnionFind:
    def __init__(self,size):
        self.parent=list(range(size+1))
    def find(self,s):
        if self.parent[s]!=s:
            self.parent[s]=self.find(self.parent[s])
        return self.parent[s]
    def union(self,s,t):
        root_s=self.find(s)
        root_t=self.find(t)
        if root_s!=root_t:
            self.parent[root_s]=self.parent[root_t]
    def is_same(self,s,t):
        return self.find(s)==self.find(t)
def main():
    import sys
    input=sys.stdin.read
    data=input().split()
    index=0
    n=int(data[index])
    uf=UnionFind(n)
    index+=1
    m=int(data[index])
    index+=1
    for _ in range(m):
        s=int(data[index])
        index+=1
        t=int(data[index])
        index+=1
        uf.union(s,t)
    source=int(data[index])
    index+=1
    destination=int(data[index])
    if uf.is_same(source,destination):
        print(1)
    else:
        print(0)
if __name__=="__main__":
    main()
posted @ 2026-05-31 19:04  zidurile  阅读(15)  评论(0)    收藏  举报