快速搞定并查集算法

目录

  • 算法介绍

    • wiki
    • 通俗解释
  • 算法实现(C语言)
  • 算法实战

算法介绍

wiki

并查集

通俗解释

零基础学并查集算法

算法实现(C语言)

  • Find函数(未采用路径压缩)
int Find(int x)
{
    int r = x;
    while(pre[r] != r)
    {
        r = pre[r];
    }
    return r;
}
  • Find函数(路径压缩递归实现)
int Find(int x)
{
    if(pre[x] == x) return x;
    else
    {
        pre[x] = Find(pre[x]);
        return pre[x];
    }
}
  • Find函数(路径压缩非递归实现)
int Find(int x)
{
    int r = x;
    while(pre[r] != r)
    {
        r = pre[r];
        int i = x,int j;
        while(i != r)
        {
            j = pre[i];
            pre[i] = r;
            i = j;
        }
    }
    return r;
}
  • Join函数
void Join(int x,int y)
{
    int fx = Find(x),fy = Find(y);
    if(fx != fy) pre[fx] = fy;
}

算法实战

  • HOJ-1232
    修改的地方是每相连两个城镇需要额外多一步 —— 减少道路数。
#include<stdio.h>
int pre[1000];
int Find(int x)
{
    int r = x;
    while(pre[r] != r)
    {
        r = pre[r];
        int i = x,int j;
        while(i != r)
        {
            j = pre[i];
            pre[i] = r;
            i = j;
        }
    }
    return r;
}
int Join(int x,int y,int roadNum)
{
    int fx = Find(x),fy = Find(y);
    if(fx != fy)
    {
        pre[fx] = fy;
        return roadNum-1;
    }
    else return roadNum;
}
void Init(int n)
{
    for(int i = 1;i <= n;i++)
    {
        pre[i] = i;
    }
}
int main()
{
    int N,M,ret = 0,i,a,b;
    while(scanf("%d",&N)&&N)
    {
        Init(N);
        ret = N-1;
        scanf("%d",&M);
        for(i = 0;i < M;i++)
        {
            scanf("%d %d",&a,&b);
            ret = Join(a,b,ret);
        }
        printf("%d\n",ret);
    }
    return 0;
} 

原文地址:https://www.cnblogs.com/multhree/p/10364653.html

时间: 2024-08-10 21:42:44

快速搞定并查集算法的相关文章

白话经典算法系列之六 快速排序 快速搞定 【转】

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影. 总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定. 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策

白话经典算法系列之六 快速排序 快速搞定

快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影. 总的说来,要直接默写出快速排序还是有一定难度的,因为本人就自己的理解对快速排序作了下白话解释,希望对大家理解有帮助,达到快速排序,快速搞定. 快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序.它采用了一种分治的策

Union-Find 并查集算法

一.动态连通性(Dynamic Connectivity) Union-Find 算法(中文称并查集算法)是解决动态连通性(Dynamic Conectivity)问题的一种算法.动态连通性是计算机图论中的一种数据结构,动态维护图结构中相连信息.简单的说就是,图中各个节点之间是否相连.如何将两个节点连接,连接后还剩多少个连通分量.有点像我们的微信朋友圈,在社交网络中,彼此熟悉的人之间组成自己的圈子,熟悉之后就会添加好友,加入新的圈子.微信用户有几亿人,如何快速计算任意两个用户是否同属于一个圈子呢

eclipse 关联 hadoop 源代码------快速搞定

最近学习 hadoop, 建了个工程,由于是引入的 jar 包,不方便阅读, 百度了一下,发现还是各种麻烦, 在这里给大家介绍一种简单的办法,两步搞定 一. 下载 hadoop 完整包并解压 二.选择 hadoop jar 包 ---> 右键属性--> source---> 外部文件夹(选择解压的目录就可以了) 三. 看成果 是不是方便多了? 其他的都可以参考这种办法,简单快捷 eclipse 关联 hadoop 源代码------快速搞定,布布扣,bubuko.com

【algorithms IV】带权重的并查集算法

问题 普通的Union-find并查集算法没有加入权重, 可以构造特别的输入使得每次合并的时候高的树HighTree以低的树LowTree的根[root(LowTree)]为新的根, 造成树的不平衡,从而使得效率下降. 用一个新的数组标记节点当前的高,可以用来在合并的时候减少时间. 当然了,这种方法的空间复杂度会提高一倍,看实际情况使用了. public class WeightedQuickUnionUF { private int[] id; // parent link (site ind

并查集算法详解

更好的阅读体验 并查集算法详解 算法详解 维护类型 身为一个数据结构,我们的并查集,它的维护对象是我们的关注点. 并查集适合维护具有非常强烈的传递性质,或者是连通集合性质. 性质详解 传递性质 传递性,也就是具有传递效应的性质,比如说A传递给B一个性质或者条件,让B同样拥有了这个性质或者条件,那么这就是我们所说的传递性. 连通集合性质 连通集合性,和数学概念上的集合定义是差不多的, 比如说A和B同属一个集合,B和C同属一个集合,那么A,B,C都属于同一个集合.这就是我们所谓的连通集合性质. 算法

抓紧面试前的宝贵时间 快速搞定前端初级JavaScript面试

第1章 课程介绍[说说面试的那些事儿]本章会出几个面试题,分析每道题目设计的知识点,然后总结出一个完整的知识体系.让我们开始 “题目->知识点->解题” 的快乐之旅吧. 第2章 JS基础-变量类型和计算[不会变量,别说你会JS]本章介绍变量的类型和计算的知识点和题目,包括值类型和引用类型区别,类型判断,深拷贝等.变量和类型是一个任何一门语言的基础,不了解的话,会被认为是 JS 语法不过关. 第3章 JS基础-原型和原型链[三座大山之一,必考!!!]本章介绍原型.原型链和 class 相关的知识

快速搞定前端初级JavaScript面试完整版

资源获取链接:点击获取完整教程 抓紧面试前的宝贵时间 快速搞定前端初级JavaScript面试 BAT资深面试官针对时下面试高频考点,帮你解决面试问题.课程不局限于简单地讲解每一个知识点,而是以面试官的角度出发,带你了解前端面试中每个“门道”与“套路”.手把手带你分析考点及解答策略,梳理JS考试体系,帮助前端新人快速通过JS面试部分. 课程紧凑,分秒必争 拒绝题海战术,绝不浪费时间解析典型面试题,分析前端面试核心考点拆解一道题,解决一类题 匠心设计,直击考点 凝聚讲师三年面试课程授课经验结合大量

零基础学并查集算法

并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了.以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定.不分享出来真是对不起party了.(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的.最后要解决的是整幅图的连通性问题.比如随意给你两个点,让你判断它们是否连通,或者问你整幅图一共有几个连通分支,也就是被分成了几个互相独立的块.像畅通工程这题,问还需要修