当前位置: 首页 > java >正文

经典算法 输出在环上的点

输出在环上的点

问题描述

给你一个无向图,已知这个图上有一些环,请输出所有环路上的节点编号。

输入描述

第一行包含一个整数 N

后面N行每行两个整数 a,b,表示 ab 之间有一条边相连。

你可以假设节点编号是在1-100000范围内,并且你可以假设不需要对节点做离散化处理。

输出描述

按字典顺序输出环路上的节点编号。

示例输入

5
1 2
3 1
2 4
2 5
5 3

示例输出

1 2 3 5

c++代码

#include<bits/stdc++.h>
#include<stdio.h>using namespace std;int a, b, x;int main() {int N;scanf("%d", &N);vector<vector<int>> arr(N + 1);vector<int> d(N + 1, 0), ans;for (int i = 0; i < N; i++) {scanf("%d %d", &a, &b);arr[a].push_back(b), arr[b].push_back(a), d[a]++, d[b]++;}queue<int> qu;for (int i = 1; i <= N; i++) {if (d[i] == 1) qu.push(i);}while(!qu.empty()) {x = qu.front(), qu.pop(), d[x]--;for (int y : arr[x]) {d[y]--;if (d[y] == 1) qu.push(y);}}for (int i = 1; i <= N; i++) {if (d[i] > 1) ans.push_back(i);}sort(ans.begin(), ans.end());for (int i = 0; i < ans.size(); i++) {printf("%d", ans[i]);if (i != ans.size() - 1) printf(" ");}return 0;
}//by wqs

题目解析

判断一个图是否有环,依次删除度为 1 的点以及与其相连的边,这样可以把所有不成环的链上点依次删除,最后也无法被删除的点集就是题目要求的答案,按照编号从小到大输出即可。

具体步骤

  1. 统计所有点的入度;
  2. 创建一个队列维护所有入度为 1 的点,将所有度等于 1 的节点加入队列。(本题中没有独立的节点,所以不用考虑度为 0 的情况);
  3. 当队列不为空时,弹出队首元素,把与队首元素相邻的节点入度减 1,如果相邻节点度数变为 1,则将相邻节点加入队列;
  4. 循环结束后,从小到大判断每个结点的入度,若入度大于 1,则说明该节点在环内,输出该节点。
http://www.xdnf.cn/news/878.html

相关文章:

  • 【阿里云大模型高级工程师ACP学习笔记】2.1 用大模型构建新人答疑机器人
  • 绿色体育直播赛事扁平自适应M25直播模板源码
  • Qt项目——汽车仪表盘
  • git详解
  • Vue v-for 循环DOM 指定dom个数展示一行
  • 【图像变换】pytorch-CycleGAN-and-pix2pix的学习笔记
  • Git 大文件使用 Git-LFS 管理,推送失败
  • .NET WPF 三维模型
  • 【xlog日志文件】怎么删除里面包含某些字符串的行(使用excel)
  • 垂直行业突围:工业软件在汽车、航空领域的 “破壁” 实践
  • 星云智控科技-优雅草星云物联网AI智控系统软件产品技术栈一览表-优雅草卓伊凡
  • android的 framework 是什么
  • 【MySQL】数据库安装
  • 第十四届蓝桥杯 2023 C/C++组 平方差
  • NLTK 基础入门:用 Python 解锁自然语言处理
  • 【回眸】error: failed to compile `xxxxxx`重装rust环境
  • 【数据结构和算法】4. 链表 LinkedList
  • 87233系列USB连续波功率探头
  • git远程分支重命名(纯代码操作)
  • 【FFmpeg从入门到精通】第四章-FFmpeg转码
  • PyTorch 线性回归详解:模型定义、保存、加载与网络结构
  • 回车键监听
  • MYSQL之基础认识(卸载安装登录, 基本概念)
  • 【日志体系】ELK Stack与云原生日志服务
  • go for 闭环问题【踩坑记录】
  • 解决Mac 安装 PyICU 依赖失败
  • 反向传播思想
  • 【Flask】Explore-Flask:早期 Flask 生态的实用指南
  • 测试用例书写规范详解:构建高效测试体系的基础
  • Java第六节:创建线程的其它三种方式(附带源代码)