zoukankan      html  css  js  c++  java
  • 并查集模板题

                                                                            题目:relation

    Relations (rela.pas  rela.in   rela.out)
    或许你并不知道,你的某个朋友是你的亲戚。他可能是你的曾祖父的外公的女婿的外甥的表姐的孙子。如果能得到完整的家谱,判断两个人是否亲戚应该是可行的,但如果两个人的最近公共祖先与他们相隔好几代,使得家谱十分庞大,那么检验亲戚关系实非人力所能及.在这种情况下,最好的帮手就是计算机。
    为了将问题简化,你将得到一些亲戚关系的信息,如同Marry和Tom是亲戚,Tom和Ben是亲戚,等等。从这些信息中,你可以推出Marry和Ben是亲戚。请写一个程序,对于我们的关心的亲戚关系的提问,以最快的速度给出答案。
    输入文件:
    第一部分以N,M ,Q开始。N为问题涉及的人的个数(1 ≤ N ≤ 20000)。这些人的编号为1,2,3,…,N。下面有M行(1 ≤ M ≤ 1000000),每行有两个数ai, bi,表示已知ai和bi是亲戚.
    第二部分Q行有Q个询问(1 ≤ Q ≤ 1 000 000),每行为ci, di,表示询问ci和di是否为亲戚。
    输出文件:
    对于每个询问ci, di,若ci和di为亲戚,则输出Yes,否则输出No。
    样例输入:
    10 7 3
    2 4
    5 7
    1 3
    8 9
    1 2
    5 6
    2 3
    3 4
    7 10
    8 9
    样例输出:
    Yes
    No
    Yes
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int fa[200001],n,m,q;
    int find(int x){
    	if (fa[x]==x) return x; else return fa[x]=find(fa[x]);
    }
    int main()
    {
    	int i,j,s,t,a,b;
    	freopen("relation.in","r",stdin);
    	freopen("relation.out","w",stdout);
    	
    	scanf("%d%d%d",&n,&m,&q);
    	for (i=0;i<n;i++) fa[i]=i;
    	
    	for (i=0;i<m;i++){
    		scanf("%d%d",&s,&t);
    		fa[find(s)]=find(t);
    	}
    	for (i=0;i<q;i++){
    		scanf("%d%d",&a,&b);
    		if(find(a)==find(b)) printf("Yes
    "); else printf("No
    ");
    	}
    	return 0;
    }
    

     解析详见:并查集理论

  • 相关阅读:
    安装 TensorFlow
    Active Learning
    基于PU-Learning的恶意URL检测
    AAAI 2018 论文 | 蚂蚁金服公开最新基于笔画的中文词向量算法
    Graph 卷积神经网络:概述、样例及最新进展
    深度学习在graph上的使用
    xgboost入门与实战(实战调参篇)
    xgboost入门与实战(原理篇)
    机器学习中的损失函数 (着重比较:hinge loss vs softmax loss)
    <html>
  • 原文地址:https://www.cnblogs.com/polebug/p/3621225.html
Copyright © 2011-2022 走看看