zoukankan      html  css  js  c++  java
  • 并查集

    Dev.C++并查集:在集合中,你要查某人的霸霸祖先,暴力就会显得很慢,于是,并查集出现了~~~
    老规矩,先贴……不,这次贴道极难的模板题,请看

    贴上我的TLE(不你们什么也没有看到)代码


    #include<bits/stdc++.h>
    using namespace std;
    int fa[10100],n,m;
    int find(int x) {
        if (fa[x]==x)return x;
        else return find(fa[x]); 
    }
    void union_(int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x==y)return;
        fa[x]=y; 
    }
    int main()
    {
    	scanf("%d%d",&n,&m);
    	for(int i=0;i<n;i++)fa[i]=i;
    	while(m--)
    	{
    		int x,y,z;
    		scanf("%d%d%d",&x,&y,&z);
    		if(x==1)union_(y,z);
    		else
    		{
    			if(find(y)==find(z))cout<<"Y"<<endl;
    			else cout<<"N"<<endl;
    		}
    	}
    	return 0;
    }
    

    变量解释:fa:的记录某个人爸爸是谁,特别规定,祖先的爸爸是他自己


    int find(int x) {
        if (fa[x]==x)return x;
        else return find(fa[x]); 
    }
    

    find(x):查找x的祖宗(即“根”)
    定义:特别规定,祖先的爸爸是他自己,所以出现了if (fa[x]==x)return x;。
    否则就找他的祖先: else return find(fa[x]);


    void union_(int x,int y)
    {
        x=find(x);
        y=find(y);
        if(x==y)return;
        fa[x]=y; 
    }
    

    union_(x,y):合并x和y所在的集合
    合并集合,就让这两个集合的霸霸祖宗相认(一个人认另一个人为霸霸),所以要 x=find(x);y=find(y);
    如果他俩是一家人,也就是说他们的祖宗是同一个人,就不管他啦,所以有if(x==y)return;
    否则就相认fa[x]=y;
    这个代码主要部分就ok了!


    结论:其实并查集同样是个模板,像高精度一样(不知道高精度的戳这),所以

    还是那句话:最好背下来哦!

  • 相关阅读:
    HBase with MapReduce (MultiTable Read)
    HBase with MapReduce (SummaryToFile)
    HBase with MapReduce (Summary)
    HBase with MapReduce (Read and Write)
    HBase with MapReduce (Only Read)
    Hbase中的BloomFilter(布隆过滤器)
    HBase的快照技术
    How To Use Hbase Bulk Loading
    Cloudera-Manager修改集群的IP
    Java中的HashSet和TreeSet
  • 原文地址:https://www.cnblogs.com/riced/p/13447248.html
Copyright © 2011-2022 走看看