并查集---判断图中是否存在环

并查集 文章目录并查集1.基础知识1.1 边带权并查集1.2 扩展域并查集1.3 并查集判断奇环2. 例题2.1 边带权并查集2.2 拓展域并查集2.3 并查集判环2.4 并查集区间合并2.5 路径压缩思想运用--从并查集思想出发 并查集 1.基础知识 1.1 边带权并查集 适用条件: 这样的方法适用于维护存在距离关系的情况,比如说统计相互间的大小关系,距离关系 具体方法: 设置一个d数组,d[u]表示u到fa[u]的距离(或者表示u和fa[u]的属性是否相同) 在两个地方需要维护: 在做get操作时维护a到pa 阅读详情

算法描述:

并查集(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多,如其求无向图的连通分量个数、最小公共祖先、带限制的作业排序,还有最完美的应用:实现Kruskar算法求最小生成树。

算法实现:

//并查集判断是否存在环
#include <iostream>
#include <stdlib.h>
#include <string.h>
using namespace std;
//图中的边
struct Edge
{
    int start;//边的起点
    int end;//边的终点
};
//图结构体
struct Graph
{
    // V顶点个数, E边的个数
    int V,E;
    // 图就是边的集合!!!!!
    struct Edge* edge;
};
//创建一个图
struct Graph* createGraph(int V, int E)
{
    struct Graph* graph=(struct Graph*) malloc(sizeof(struct Graph));
    graph->V = V;
    graph->E = E;
    //生成graph->E条边的图
    graph->edge = (struct Edge*) malloc(graph->E*sizeof(struct Edge));
    return graph;
};
//查找元素i所在集合(根节点)
int find(int parent[], int i)
{
    //一维数组parent[] 来记录子集合
    if(parent[i]==-1)
    {//i的根节点是其自身
        return i;
    }
    //查找i的根节点所在集合
    return find(parent, parent[i]);
}
//合并集合
void join(int parent[], int x, int y)
{
    int xset=find(parent,x);
    int yset=find(parent,y);
    if(xset != yset)
    {
        parent[xset]=yset;
    }
}
//检测是否有环
int isCycle(struct Graph* graph)
{
    int *parent = (int*) malloc(graph->V * sizeof(int));
    //初始化所有集合(每个节点)
    //parent[n] 的每个元素都为-1,共有n个子集合,表示集合只有当前顶点一个元素
    memset(parent, -1, sizeof(int) * graph->V);
    //遍历所有边
    for(int i=0;i<graph->E;++i)
    {
        int x = find(parent, graph->edge[i].start);
        int y = find(parent, graph->edge[i].end);
        if(x==y)
        {//如果在一个集合就找到了环
            return 1;
        }
        join(parent, x, y);
    }
    return 0;
}
int main()
{
    /* 创建图
         0
         | \
         |   \
         1----2 */
    struct Graph* graph = createGraph(3,3);
    // 添加边 0-1
    graph->edge[0].start=0;
    graph->edge[0].end=1;
    // 添加边 1-2
    graph->edge[1].start=1;
    graph->edge[1].end=2;
    // 添加边 0-2
    graph->edge[2].start=0;
    graph->edge[2].end=2;
    if (isCycle(graph))
    {
        cout<<"graph contains cycle"<<endl;
    }
    else
    {
        cout<<"graph doesn't contain cycle"<<endl;
    }
    return 0;
}

九度1024 畅通工程

//使用并查集实现了kruskal算法求最小花费树
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
typedef struct node
{
    int start;
    int end;
    int cost;
}Node;
int father[101];
int rank[101];
void Make_Set(int M)
{
    for(int i=1;i<=M;i++)//村庄从1开始编号
    {
        father[i]=i;
        rank[i]=0;
    }
}
int Find_Set(int x)
{
    if(x != father[x])
    {
        father[x]=Find_Set(father[x]);
    }
    return father[x];
}
int Union(int x,int y)
{
    x=Find_Set(x);
    y=Find_Set(y);
    if(x==y) return 0;//若没有合并,则返回0
    if(rank[x]>rank[y])
    {
        father[y]=x;
        rank[x] += rank[y];
    }
    else
    {
        if(rank[x]==rank[y])
        {
            ++rank[y];
        }
        father[x]=y;
    }
    return 1;//若进行了合并,则返回1
}

int cmp(const void *p, const void *q)
{
    Node * p1=(Node *)p;
    Node * q1=(Node *)q;
    return p1->cost - q1->cost;//从小到大
}

int main()
{
    int N,M;
    int ans;
    int cnt;
    Node road[5000];
    while(cin>>N>>M&&N)
    {
        for(int i=0;i<N;i++)
        {
            scanf("%d%d%d",&road[i].start,&road[i].end,&road[i].cost);
        }
        qsort(road,N,sizeof(Node),cmp);//将N条道路的花费值从小到大排序
        Make_Set(M);
        ans=0;
        cnt=0;
        for(int i=0;i<N;i++)
        {
            if(cnt==M-1)//按照树的定义,M个点有M-1条连线
                break;
            if(Union(road[i].start,road[i].end))
            {
                ++cnt;
                ans += road[i].cost;
            }
        }
        if(cnt==M-1)//实现了kruskal算法求最小花费树
        {
            printf("%d\n",ans);
        }
        else
        {
            printf("?\n");
        }
    }
    return 0;
}
一体化伺服电机与施耐德PLC TM241CEC24T在Canopen协议下的应用 一.硬件组成 软件组成:施耐德SoMachineV4.3二.○1.打开SoMachineV4.3,点击“新建项目”○2.点击“空白项目”○3.项目命名○4.点击“创建项目” 三. 点击“Logic Builder” 四. ○1.右击项目”PMM_CANOPEN_ST”添加设备○2.点击”LogicController”选择PLC型号TM241CEC24T/U○3.点击“添加设备” 五. ○1.右击CAN_1,添加设备○2.选择“CANopen Perfomance”○3.点击“添加设备” 阅读详情

相关推荐

从毫米波到计算机视觉:智能座舱监控系统的多模态技术融合

本文探讨了智能座舱监控系统中多模态技术融合的创新应用,涵盖毫米波雷达、红外传感与计算机视觉的协同架构。通过传感器时空对齐、低光照算法突破及隐私保护设计,系统在DMS、OMS等场景实现99.7%的检测准确率,同时优化成本至$45以内,为汽车智能化提供关键技术支撑。

d6e7f8的博客 902

并查集判环(无向图)

小希的迷宫 题意: 判断所给图是否连通且无环,满足输出 “Yes”,否则输出 “No” 思路: 并查集判断连通并且无环即可 code: #include<bits/stdc++.h> #define endl '\n' #define ll long long #define ull unsigned long long #define ld long double #define all(x) x.begin(), x.end() #define eps 1e-6 using namespac

cosx_的博客 6523

LLM大模型基础知识【一】

大语言模型(LLM):是指在自然语言处理(Natural Language Processing,NLP)领域中的一类大模型,通常用于处理文本数据和理解自然语言。这类大模型的主要特点是它们在大规模语料库上进行了训练,以学习自然语言的各种语法、语义和语境规则。例如:GPT系列(OpenAI)、Bard(Google)、文心一言(百度)。视觉大模型:是指在计算机视觉(Computer Vision,CV)领域中使用的大模型,通常用于图像处理和分析。

lin_xi_xi的博客 2880

c++实现_Kruskal算法(最小生成树算法)

#include<iostream> #include<vector> #include<algorithm> using namespace std; typedef pair<int, int> iPair; struct Graph { int V, E;//V:the number of the vertices //E:the number of edges vector<pair<int, iPair>> e.

SmartDemo的博客 435

PCIe5.0均衡简介(整理版)

pcie5.0 均衡 equalization

m0_53559277的博客 9109

速腾RS-LiDAR-16激光雷达ROS环境搭建与点云可视化实战指南

本文提供速腾RS-LiDAR-16激光雷达在ROS环境下的完整搭建与可视化实战指南。从硬件连接、网络配置、驱动安装编译,到核心参数详解与Rviz点云可视化,手把手解决IP设置、坐标系对齐等常见问题,帮助开发者快速实现激光雷达三维点云数据的采集与显示。

weixin_29271263的博客 372

并查集-求有向图中是否有环

java刷题:简单介绍一下并查集,并利用并查集查看有向图是否存在至少一个环

Nelson_hehe的博客 1859

查找【优快云】- 人工客服

【代码】查找【优快云】- 人工客服。

👨‍💻 前端开发者 | 技术分享者 1403

有向图找环( 并查集 )

假设有一条 x−>yx->yx−>y 的有向边,当建立连接时,更新xxx的父节点,同时更新xxx 到父节点的距离 len[x]=len[y]+1len[x]=len[y]+1len[x]=len[y]+1 若父节点相同说明存在环,环的大小为 len[x]+len[y]+1。len[x]+len[y]+1。len[x]+len[y]+1。 #include<bits/stdc++.h> #define LL long long #define pii pair<LL,LL&

qhq889的博客 3928

iStoreOS等软路由插件卸载的残留?分享一款软路由高级卸载工具,自定义卸载,轻松解决卸载残留问题

iStoreOS用户看过来!👀 还在被插件包残留困扰吗?本文分享一款“高级卸载”的插件,助你深度清理iStoreOS系统,彻底解决软件卸载不净的痛点,告别频繁恢复出厂设置的烦恼!🚀

XiaoqiangClub的博客 1545

YOLO12涨点改进| 损失函数改进篇 |AAAI 2025| 一种小目标检测SDLoss损失函数,解决现有损失函数对不同目标尺度敏感度不足的局限,提高了网络检测不同尺度目标的敏感能力,助力高效涨点

本文提出了一种改进的小目标检测方法SDLoss,通过动态调整尺度损失与位置损失的权重,优化了YOLOv12模型的性能。针对红外小目标检测中存在的两个主要问题:1)标准卷积难以捕捉目标的高斯空间分布特性;2)现有损失函数对不同尺度目标的敏感度不足,研究团队开发了Pinwheel-shaped卷积(PConv)和Scale-based Dynamic损失函数(SDLoss)。PConv通过不对称卷积核设计显著提升感受野,SDLoss则根据目标大小动态平衡尺度与位置损失的影响。

Ai缝合怪、助力小伙伴高效发论文 238

并查集判断图中是否存在环

以前听并查集的时候没好好听,导致做题一直没能彻底搞懂,今天在B站上听了灯笼哥的详细讲解,算是彻底搞懂了。 传送门:https://www.bilibili.com/video/av38498175/?p=1 假如题目要求读入n,m分别为顶点数和边的条数,并且下面m行跟着图中每条边的起点和终点,求判断此图中是否存在环 #include<bits/stdc++.h> usi...

追风者 1865

华为OD新系统机试真题 - 获取大写字母瓷砖拼出独特图案数量

华为OD机试新系统真题【获取大写字母瓷砖拼出独特图案数量】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD新系统四月二十九号机试真题【获取大写字母瓷砖拼出独特图案数量】

qq_45776114的博客 1219

并查集 Disjoint Set 检查图中是否有环

package 并查集; import java.util.Scanner; public class 并查集 { //英文名字叫Disjoint Set,作用检查一个图是否存在一个环 //将代表父节点的数组parent[],每一个元素的值初始化为-1,代表每一个节点都是根节点,是一棵独立的树。 //rank数组表示树的高度,一开始一棵树只有一个节点则每棵树的高度都初始为0; //有多少个节点一...

aiwo1376301646的博客 381

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

判断图是否有环的两种算法

求欧拉回路时首先需要判断它是否为一个连通的回路,下面有两种算法来判断。 dfs深搜 #include <iostream> #include <vector> #include <string.h> using namespace std; int sta[1200];//sta代表每个结点的状态,-1代表还没被访问,0代表正在被访问,1代表访问结束...

Ven 4246

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

使用并查集判断图中是否含有环

使用并查集判断图中是否含有环 1 // function: 2 // 使用并查集判断图中是否含有环 3 // 须知:parent[x1] = x2 表示顶点x1的父节点是x2 4 #include<iostream> 5 using namespace std; 6 7 #define VERTICES 6 8 9 // 初始化 10 vo...

weixin_30852367的博客 289

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

hdu 1272 并查集判断连通无环图

题意:判断连通无环图。DFS或者并查集。 无环: 判断成环的时候,只要判断输入边的两个点。有一个共同的父节点,那么这两个点就成环。 连通:根节点数是1代码:#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std;const int MAXN = 1e5+10

wtml 297

判断无向图是否有环

无向图: 1 并查集                                                                               首先我们把每个点看成独立的集合{0} ,{1}, {2}, 然后规定如果两个点之间有边相连,如果这两个点不属于同一个集合,那就将他们所属的结合合并,看边0-1,直接将这两个点代表的集合合并{0, 1},

我有一个梦想 6883

无向图判断环

无向图判断环一、算法描述二、JAVA 实现 一、算法描述         对于无向图的判断环的问题,可以使用并查集来解决。并查集通常是一维数组,数组下标表示图中节点的序号,数组中的元素代表其下标对应节点的前置节点在数组中下标。如图所示:         并查集有两个基本操作1.找到指定节点的根节点。2.对两个不同根的节点进行合并。而判断环的操作就是检查新加入的边的两个节点的根节点是否相同。 二、JAVA 实现 public b

weixin_37870999的博客 869

检查无向图的连通以及是否存在环

J - 小希的迷宫HDU - 1272 1 #include <iostream> 2 #include <cstring> 3 #include <queue> 4 #include <set> 5 using namespace std; 6 const int maxn=1e5+5; 7 8 ...

dieche3140的博客 623

并查集:判断环,树

基础并查集 HDU - 1272 小希的迷宫 #include <set> #include <map> #include <list> #include <cmath> #include <stack> #include <queue> #include <string> #include <bitset> #include <vector> #include<cstring> #i.

weixin_46220615的博客 228

并查集|1971. 寻找图中是否存在路径、684.冗余连接、685.冗余连接II

前两种入度为2的情况,一定是删除指向入度为2的节点的两条边其中的一条,如果删了一条,判断这个图是一个树,那么这条边就是答案,同时注意要从后向前遍历,因为如果两条边删哪一条都可以成为树,就删最后那一条。输入一个有向图,该图由一个有着 n 个节点(节点值不重复,从 1 到 n)的树及一条附加的有向边构成。首先先计算节点的入度,edges[i][1] 表示的节点都是 箭头指向的节点,即这个几点有一个入度!题目说是无向图,返回一条可以删去的边,使得结果图是一个有着N个节点的树(即:只有一个根节点)。

qq_60513199的博客 1191

历届试题 发现环 (并查集+DFS)

题目地址 发现环 解题思路 通过并查集判断出图的环,然后dfs查找到它所在环的路径,得到顶点数组,进行一次排序输出。虽然题目没说,但我觉得应该就是一个环,这样就能保证把环里的顶点全都不重复的放到数组里了。因此dfs放在循环里和循环外都行,memset写不写也都行。 AC代码 #include <iostream> #include <queue> #include <...

qq_43227036的博客 278

并查集与并查集判环

并查集与并查集判环并查集什么是并查集?题解并查集判环题解 并查集 并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中,其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能

qinian1841128521的博客 494

简单算法 并查集的环判断

int find(int x) { int r=x; while(pre[r]!=r) { r=pre[r]; } } void join(int x,int y) { int a=find(x); int b=find(y); if(a!=b) pre[a]=b; else if(a==b)//这里是重点 sign=-1;//用来标记已经是环了 } 为什么根一样就是环...

weixin_44804187的博客 724
上一篇: leetcode 188---Best Time to Buy and Sell Stock IV
下一篇: Kruskal---求最小生成树(贪心算法)
爱橙子的OK绷
博客等级 码龄15年 351粉丝 329原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值