• 关于对并查集的理解


    并查集:

          1. 应用:并查集一般常被应用于处理一些不相交集合的查找和合并问题。最经典的问题:已知某镇上有n个村庄(可以想象成n个不相连的点),其中已有有m条路联通这n个村庄,问至少还需再建多少条路,才能使n个村庄都连起来(村庄与村庄不一定直接连起来,只要保证能从某个村庄到某个村庄即可),又或者问某个村和某个村是否相连。  可以在纸上画一画,便于理解。

          2.定义:

                    英文:Disjoint Set,即“不相交集合”
                    将编号分别为1…N的N个对象划分为不相交集合,
                    在每个集合中,选择其中某个元素代表所在集合。

                    常见两种操作:
                              合并两个集合
                              查找某元素属于哪个集合

                  所以,也称为“并查集”


               为什么要先给出应用呢,因为我发现直接给出定义会使对概念理解的不深刻,先给出应用便于结合它理解定义。

       3.代码实现:

             相信现在你已经对并查集算法有了一个大致的印象,已经迫不及待的想做出这道题了吧,哈哈^~^.

      

    以问的第二个问题为例:      

    #include <stdio.h>
    
    int bin[100002];
    int findx(int x)寻找父节点的函数
    {
        int r=x;
        while(bin[r] !=r)
            r=bin[r];
        return r;
    }
    void merge(int x,int y)
    {
        int fx,fy;
        fx = findx(x);
        fy = findx(y);
        if(fx != fy)
            bin[fx] = fy;
    }
    
    int main()
    {
        int n, m, i, j, x[10002], y[10002], k, count=0;//n,m分别为村庄数和已连接的路的条数,x,y为已连接的村庄的编号
        //c, d   代表输入的两个村庄的编号,问这两个村庄是否相连
        while(scanf("%d",&n)!=EOF)
        {
            count = 0;
            for(i=0;i<n;i++)//使单独的点的父节点为自己
                bin[i] = i;
            scanf("%d",&m);
            for(j=0; j<m; j++)
            {
                scanf("%d %d",&x[j],&y[j]);//输入m组已知信息
            }
              scanf("%d %d", &c, &d);
            此处 留空  可根据题意自行编写。
            printf("%d
    ", count);
    
        }
        return 0;
    }
    
    
                                 

    未完》》》》》


     

    每天训练发现我比别人做的好慢,但是理解的更深刻,如果一开始学一个新知识点就搜模板,那么这样的人是走不远的,毕业之后带走的只有思维,什么荣誉,奖杯都已经不重要了。
  • 相关阅读:
    由浅入深——从ArrayList浅谈并发容器
    Lambda表达式
    JVM初体验
    Redis主从复制
    Redis事务
    Redis基本命令
    Redis概述与安装
    Linux之SSH免密登录
    源码安装Nginx以及用systemctl管理
    CentOS 7 :Failed to start IPv4 firewall with iptables.
  • 原文地址:https://www.cnblogs.com/6bing/p/3931271.html
Copyright © 2020-2023  润新知