hdoj-1232 畅通工程【并查集】-程序员宅基地

技术标签: 并查集  

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1232

并查集详见http://blog.csdn.net/qq_29606781/article/details/47439437

 

#include<stdio.h>
int per[10100];

void init(int N)
{
    int i;
    for(i=1;i<=N;++i)
    {
        per[i]=i;
    }
}

int find(int x)//根节点 
{
    int t=x;
    while(per[t]!=t)
    {
        t=per[t];//更新节点 
    }
    int r=t;//到根节点,注意节点r的父节点也是r 
    int i=x,j;
    while(i!=r) //路径压缩 
    {
        j=per[i]; //把下一个节点保存一下 ,也就是当前节点的父节点 
        per[i]=r;//把当前这个节点的父节点赋值为根节点
        i=j;//更新节点 
    }
    return r;//返回根节点      
}

void join(int x,int y)//合并两个节点 
{
    int fx=find(x);
    int fy=find(y);
    if(fx!=fy)//如果x,y的根节点不同
    {
        per[fx]=fy;//把两个根节点连接 
        //至于哪个和哪个节点连接,看深度,可以开个数组,把深度小的连到深度大的 
        //这是一种优化方式,数据大的时候可以用 
    } 
}

int main()
{
    int n,m,i,x,y,cnt;
    while(scanf("%d",&n),n)
    {
        cnt=0;
        init(n);//初始化
        scanf("%d",&m);
        while(m--)
        {
            scanf("%d%d",&x,&y);
            join(x,y);            
        }    
        for(i=1;i<=n;++i)
        {
            if(per[i]==i)
            {
                ++cnt;//到根节点的个数,即有几个集合 
            }
        }    
        printf("%d\n",cnt-1); 
    }
    return 0;
}


 

//递归压缩路径, 有高度优化
//时间:31

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
#define maxn 1100
#define INF 0x3f3f3f3f
using namespace std;

int per[1100];
int ran[1100];      //ran:深度 
int n, m;
void init(){
    for(int i = 1; i <= n; ++i){
        per[i] = i;
        ran[i] = 0;
    }
}

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

void jion (int x, int y){
    int fx = find(x);
    int fy = find(y);
    if(fx == fy)
        return ;
    if(ran[fx] < ran[fy])//将深度小的树合并到深度大的数假设两棵树的深度分别是h1,h2 
        per[fx] = fy;//则合并后的数的高度h:max(h1,h2),if h1<>h2 
    else{            //h1+h2,if h1=h2     
        per[fy] = fx;
        if(ran[fx] == ran[fy]) ran[fx]++;
    }
}

int main (){
    while(scanf("%d", &n),n){
        scanf("%d", &m);
        init();
        int a, b;
        while(m--){
            scanf("%d%d", &a, &b);
            jion(a,b);
        }
        int ans = 0;
        for(int i = 1; i <= n; ++i){
            if(per[i] == i)
                ans++;
        }
        printf("%d\n", ans - 1);
    }
    return 0;
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_29606781/article/details/47431315

智能推荐

Cisc和Risc哪一个更适合采用流水线技术来提高性能?-程序员宅基地

文章浏览阅读1.4k次。Cisc由于指令功能复杂,规整性不好,不利于采用流水线技术来提升性能。Risc指令集,指令相对规整,功能简单,适合采用流水线技术来提高性能。

基于SpringBoot+Vue的牙科诊所管理系统的详细设计和实现(源码+lw+部署文档+讲解等)-程序员宅基地

文章浏览阅读707次,点赞9次,收藏25次。博主介绍:全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐Java精品实战案例《500套》微信小程序项目精品案例《500套》文末获取源码+数据库。

Python基础知识——爬虫入门_先我们先简单介绍一下网页的基本概念。所谓网页,也就是我们给浏览器输出一个字符-程序员宅基地

文章浏览阅读1.7k次。爬虫,即网络爬虫。打个形象的比方:一只蜘蛛在蜘蛛网上爬,可以以某种方式从网上的某个地方找到自己想要的东西。那么和网页相联系起来有什么关系呢?首先我们先简单介绍一下网页的基本概念。所谓网页,也就是我们给浏览器输出一个字符串,浏览器进行解析后,经DNS服务器找到服务器主机后,向服务器发出请求,服务器经过解析之后,向浏览器发送Html、JS、CSS等文件,再由浏览器进行解析,组成了平时我们所见的_先我们先简单介绍一下网页的基本概念。所谓网页,也就是我们给浏览器输出一个字符

PDF文件转成图片保存_itxt7 pdf 转图片-程序员宅基地

文章浏览阅读926次。1、根据文件路径获取文件,并将PDF文件的每一页转换为一个图片。其中要将图片转为base64格式的。/** * <p>Description PDF文件转成图片</p> * @author wumf * @date 2020年1月20日 上午11:00:47 * @param PdfFilePath PDF文件路径 * @..._itxt7 pdf 转图片

STM32c6t6最小系统开发板按键输入及ST-Link的连接_stmf103c6t6按键-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏9次。前提是需要做完跑马灯实验最终成果--长按,LED0亮/灭,短按LED1亮/灭。短按长按main函数#include "led.h"#include "key.h"#include "stm32f10x.h"#include "delay.h"#include "usart.h" int main(void) { delay_init(); //延时函数初始化 LED_Init(); //初始化LED KEY_Init();._stmf103c6t6按键

Linux 父进程需要创建3个子进程,但不创建孙子进程_父进程需要创建三个子进程-程序员宅基地

文章浏览阅读6.1k次,点赞19次,收藏57次。Linux 进程家族数 生成三个子进程不生成孙子进程1. 要求2. 分析2.1 getpid、getppid2.2 不让子进程再生成进程3. 代码3. 运行截图4. 绘制进程家族树1. 要求如果父进程需要创建3 子进程,但不创建孙子进程。请编写程序,并画出进程家族树。 (进程家庭树中填写进程 PID,使用 getpid, getppid)。2. 分析2.1 getpid、getppidg......_父进程需要创建三个子进程

随便推点

处女作发表-程序员宅基地

文章浏览阅读513次。处女作发表 记得在读初中的时候,语文老师说他的第一篇文章发表的时候,他特得意,感觉非常好,自己的文字总算变成了“铅字”(注:那时候用铅打印出版,便是铅字),同时也希望我们也有那么一天把自己的想法变成“铅字”,还真羡慕自己也有那么一天能够实现。虽然自己已是研究生,可惜本人不才,一直没有作品变成“铅字”,很多的老师都有自己的学术作品发表,特别是我们用自己老师编写的书籍当作大学教材,心里还是很羡慕那些才华出众的老师。机会还是来了。自参加nios比赛以来,我们一直在努力,

【验证码识别】OpenCV挑战百度拖动旋转图片角度验证码_selenium 百度旋转图片验证-程序员宅基地

文章浏览阅读10w+次,点赞27次,收藏94次。前言百度的验证码又双叒更新了。当然出于好奇,猫又拿起了键盘开始挑战。正文来了。先来看看继上次破解百度旋转验证码后,百度的大佬又做出了哪些改变。1.抓取图片时加上了马赛克2.增加了图片库抓取图片时加上了马赛克截图是这个亚子的后台拿到的却是这个亚子的哦呦,这个马赛克有点东西的呀~图片抓下来都不一样还咋识别,百度这里也是煞费苦心,给您点个赞。不过话说回来,就算这样也难不住我们的呀,这里我思考了一下还有几种方式来获取这个图片:1 .通过系统级鼠标来获取2 .通过网_selenium 百度旋转图片验证

AI人工智能是如何工作的?-程序员宅基地

文章浏览阅读815次,点赞9次,收藏20次。人工智能是如何工作的

三相光伏并网逆变器simulink仿真前级boost采用电导增量法实现最大功率追踪_三相光伏发电并网的boost电路-程序员宅基地

文章浏览阅读205次。结果表明,我们的仿真模型能够有效实现最大功率追踪和控制,并且输出波形质量好,THD小于5%。这些结果表明,我们的仿真模型能够满足实际应用的需要,并具有很高的可靠性和实用性。通过电导增量法实现最大功率追踪和dq坐标系解耦实现控制,并通过Simulink仿真得到了良好的仿真结果。本文将探讨三相光伏并网逆变器的仿真研究,通过电导增量法实现最大功率追踪,同时在dq坐标系下解耦实现控制,输出波形质量好,THD小于5%。在本文中,我们将详细介绍仿真的实现步骤和结果分析,并对仿真结果进行深入的探究和分析。_三相光伏发电并网的boost电路

NX加载角色mtx_nx1953加载角色-程序员宅基地

文章浏览阅读109次。加载NX角色_nx1953加载角色

robotframework入门-定位元素位置后滚动页面使元素可见-程序员宅基地

文章浏览阅读204次,点赞3次,收藏6次。robotframework入门-定位元素位置后滚动页面使元素可见

推荐文章

热门文章

相关标签