2 条题解
-
0
无向图联通问题 利用并查集解决
def main(): import sys #处理输入数据 n, m, p = map(int, input().split()) #创建存储列表 line = [i for i in range(n + 1)] """先创建find_root函数 作用是利用递归查找父节点 查找是根源 union函数会用到""" def find_root(x): if line[x] != x: line[x] = find_root(line[x]) return line[x]#现在返回的就是父节点了 #union函数是通过把两个同学的父节点变成一样的来让同学之间产生联系的 def union(a, b): root_a, root_b = find_root(a), find_root(b) if root_a != root_b: line[root_a] = root_b #处理同学关系 for _ in range(m): a, b = map(int, sys.stdin.readline().strip().split()) union(a, b) #进行父节点是否相同判断 for _ in range(p): a, b = map(int, sys.stdin.readline().strip().split()) if find_root(a) != find_root(b): print("No") else: print("Yes") if __name__ == "__main__": main() #无注释版本: ```python def main(): import sys n, m, p = map(int, input().split()) line = [i for i in range(n + 1)] def find_root(x): if line[x] != x: line[x] = find_root(line[x]) return line[x] def union(a, b): root_a, root_b = find_root(a), find_root(b) if root_a != root_b: line[root_a] = root_b for _ in range(m): a, b = map(int, sys.stdin.readline().strip().split()) union(a, b) for _ in range(p): a, b = map(int, sys.stdin.readline().strip().split()) if find_root(a) != find_root(b): print("No") else: print("Yes") if __name__ == "__main__": main() -
0
并查集模板题,学完就会了并查集_OIWiki
const int N=5e3+5; int fa[N]; int find(int i){ if(i!=fa[i]) fa[i]=find(fa[i]); return fa[i]; } void join(int i,int j){ int i_fa=find(i); int j_fa=find(j); fa[i_fa]=j_fa; } void solve(){ for(int i=1;i<N;i++){ fa[i]=i; } int n,m,p;cin>>n>>m>>p; for(int i=1;i<=m;i++){ int x,y;cin>>x>>y; join(x,y); } for(int i=1;i<=p;i++){ int x,y;cin>>x>>y; int fax = find(x); int fay = find(y); if(fax == fay) cout<<"Yes"<<endl; else cout<<"No"<<endl; } }
- 1
信息
- ID
- 1123
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 40
- 已通过
- 15
- 上传者