图论题之并查集的应用
- 寻找存在的路线
题目描述
给定一个包含 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()

浙公网安备 33010602011771号