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了!


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

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

  • 相关阅读:
    童年记忆
    展现、通讯、IO
    通电自动开机
    英雄每多屠狗辈,自古侠女出风尘(看黄金大劫案有感)
    反射整理学习<一>(转)
    在ASP.NET中跟踪和恢复大文件下载
    高内聚、低耦合
    你需要权限才能执行此操作
    WP7应用开发笔记(5) 通信设计
    一个简单的软件工程流程
  • 原文地址:https://www.cnblogs.com/riced/p/13447248.html
Copyright © 2011-2022 走看看