经典算法 判断一个图中是否有环

判断一个图中是否有环

问题描述

给一个以0 0结尾的整数对列表,除0 0外的每两个整数表示一条连接了这两个节点的边。假设节点编号不超过100000大于0。你只要判断由这些节点和边构成的图中是否存在环。存在输出YES,不存在输出NO。

输入样例1

in 复制代码
6 8  5 3  5 2  6 4 5 6  0 0

输出样例1

in 复制代码
NO

输入样例2

in 复制代码
8 1  7 3  6 2  8 9  7 5 7 4  7 8  7 6  0 0

输出样例2

in 复制代码
NO

输入样例3

in 复制代码
3 8  6 8  6 4 5 3  5 6  5 2  0 0

输出样例3

in 复制代码
YES

输入样例4

in 复制代码
1 2 3 4 0 0

输出样例4

in 复制代码
NO

输入样例5

空图没有环

cpp 复制代码
0 0

输出样例5

in 复制代码
NO

c++代码

cpp 复制代码
#include<bits/stdc++.h>

using namespace std;

int a, b;
int arr[100001];
bool key = false;

int myfind(int x) {
    int root = x;
    while(root != arr[root]) root = arr[root];
    int i = x, j;
    while(i != root) {
        j = arr[i];
        arr[i] = root;
        i = j;
    }
    return root;
}

void mymerge(int x, int y) {
    x = myfind(x), y = myfind(y);
    if (x != y) arr[y] = arr[x];
}

int main() {
    for (int i = 1; i <= 100000; i++) arr[i] = i;
    while(true) {
        scanf("%d %d", &a, &b);
        if (a == 0 && b == 0) break;
        if (key) continue;
        int x = myfind(a), y = myfind(b);
        if (x == y) key = true;
        else mymerge(a, b);
    }
    if (key) printf("YES");
    else printf("NO");
    return 0;
}//by wqs

算法解析

给每个点一个初始的编号,并初始化所有节点的父亲为本身。每新加入一条边就把边相连的两个集合合并到一起,如果边相连的集合原本就是同一个,说明已经成环。

相关推荐
黎雁·泠崖12 小时前
【魔法森林冒险】1/14 项目总览:用Java打造你的第一个回合制冒险游戏
java·开发语言
独好紫罗兰12 小时前
对python的再认识-基于数据结构进行-a006-元组-拓展
开发语言·数据结构·python
NuageL12 小时前
原始Json字符串转化为Java对象列表/把中文键名变成英文键名
java·spring boot·json
冉佳驹12 小时前
C++ ——— 异常处理的核心机制和智能指针管理
c++·异常捕获·异常继承体与多态·重载抛异常·raii思想·智能指针shared_ptr·weak_ptr指针
C++ 老炮儿的技术栈12 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
KYGALYX12 小时前
逻辑回归详解
算法·机器学习·逻辑回归
yuuki23323312 小时前
【C++】继承
开发语言·c++·windows
222you12 小时前
Redis的主从复制和哨兵机制
java·开发语言
铉铉这波能秀12 小时前
LeetCode Hot100数据结构背景知识之集合(Set)Python2026新版
数据结构·python·算法·leetcode·哈希算法
江湖有缘12 小时前
零基础入门:使用 Docker 快速部署 Organizr 个人主页
java·服务器·docker