卡码网 107 寻找存在的路径
初识并查集
并查集功能:
- 寻找根节点,函数: find(int u),也就是判断这个节点的祖先节点是哪个
- 将两个节点接入到同一个集合,函数: join(int u, int v),将两个节点连在同一个根节点上
- 判断两个节点是否在同一个集合,函数: isSame(int u, int v),就是判断两个节点是不是同一个根节点
python
class UnionFind:
def __init__(self, size):
self.parent = list(range(size + 1))
def find(self, u):
if self.parent[u] != u:
self.parent[u] = self.find(self.parent[u])
return self.parent[u]
def union(self, u, v):
root_u = self.find(u)
root_v = self.find(v)
if root_u != root_v:
self.parent[root_v] = root_u
def is_same(self, u, v):
return self.find(u) == self.find(v)
def main():
import sys
input = sys.stdin.read
data = input().split()
index = 0
n = int(data[index])
index += 1
m = int(data[index])
index += 1
uf = UnionFind(n)
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()