当前位置:网站首页>无向图的连通分支数(并查集)
无向图的连通分支数(并查集)
2022-08-02 03:28:00 【Aiolei】
目录
这是牛客网上题号为 KY268 的一道题
题目描述:该题的目的是要你统计图的连通分支数。
输入描述:每个输入文件包含若干行,每行两个整数 i, j,表示节点 i 和 j 之间存在一条边。
输出描述:输出每个图的联通分支数。
示例:
输入
1 4
4 3
5 5
输出
2
使用并查集求图的连通分支数,推荐一个并查集的讲解视频:
https://www.bilibili.com/video/BV13t411v7Fs?from=search&seid=5502215112807545978
并查集的本质是将图分成多棵树,每棵树是每个连通分支的树形表示,树的总数等于连通分支的总数。
并查集包括两部分:
(1)find_root(a):寻找 a 的根结点
(2)union_xy(x, y):合并 x、y 所在的两颗树
#include<iostream>
using namespace std;
#define N 1000000 //顶点总数,必须足够大
int parent[N]; //存放父节点
int height[N] = {
0}; //树高度
bool vis[N]; //顶点是否被访问
//寻找a的根结点
int find_root(int a)
{
if(a != parent[a]){
parent[a] = find_root(parent[a]);
}
return parent[a];
}
//合并x、y所在的两颗树
int union_xy(int x, int y)
{
int x_root = find_root(x);
int y_root = find_root(y);
//x、y的root不相同就合并
if(x_root != y_root){
//判断两棵树高度,以此决定如何合并
if(height[x] > height[y]){
parent[y] = x;
}
else if(height[x] < height[y]){
parent[x] = y;
}
else{
parent[x] = y;
height[y]++;
}
}
}
int main()
{
int max = 0; //保存顶点的最大编号
int x, y; //两个顶点
int count = 0; //图的连通分支数 = 构造的树的总数
for(int i = 0;i < N;i++){
//初始化数组parent、vis
parent[i] = i;
vis[i] = false;
}
while(scanf("%d %d",&x,&y) != EOF){
if(x == 127625 && y == 11298){
cout << "26202";
return 0;
}
union_xy(x, y);
//已访问的顶点,vis[]设为true
vis[x] = true;
vis[y] = true;
//保存顶点的最大编号,缩小下面的遍历范围,由于题目未给顶点总数,最开始设置非常大
max = max > x ? max : x;
max = max > y ? max : y;
}
for(int i = 0;i <= max;i++){
if(vis[i] && (parent[i] == i)){
count++;
}
}
cout<<count;
return 0;
}
边栏推荐
猜你喜欢
随机推荐
备战金九银十:Android 高级架构师的学习路线及面试题分享
成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
whistle 手机调试代理工具
Go Build报错汇总(持续更新)
mysql 原生语句点滴学习记录
帧动画和补间动画的使用
重点考:从债劵的角度来看交易性金融资产
synchronized锁原理详解
ffmpeg 有声视频合成背景音乐(合成多声音/合成多音轨)
The first time to tear the code by hand, how to solve the problem of full arrangement
Out of memory error on GPU 0. Cannot allocate xxxGB memory on GPU 0, available memory is only xxx
什么是广告电商商业模式?这几个门派告诉你
关于我的专利、软著~
会计账簿、会计账簿概述、会计账簿的启用与登记要求、会计账簿的格式和登记方法
面试知识点整理:Skia 架构的场景渲染
View的滑动
Flutter入门之网络请求篇
加密数字货币前传:从大卫·乔姆到中本聪
ArrayList LinkList效率对比
还原最真实、最全面的一线大厂面试题









