P8436 【模板】边双连通分量

news/2025/3/21 21:54:41/文章来源:https://www.cnblogs.com/gxjcnblogs/p/18785907

P8436 【模板】边双连通分量

题目描述

对于一个 \(n\) 个节点 \(m\) 条无向边的图,请输出其边双连通分量的个数,并且输出每个边双连通分量。

输入格式

第一行,两个整数 \(n\)\(m\)

接下来 \(m\) 行,每行两个整数 \(u, v\),表示一条无向边。

不保证图为简单图,图中可能有重边和自环。

输出格式

第一行一个整数 \(x\) 表示边双连通分量的个数。

接下来的 \(x\) 行,每行第一个数 \(a\) 表示该分量结点个数,然后 \(a\) 个数,描述一个边双连通分量。

你可以以任意顺序输出边双连通分量与边双连通分量内的结点。

输入输出样例 #1

输入 #1

5 8
1 3
2 4
4 3
1 2
4 5
5 1
2 4
1 1

输出 #1

1
5 1 5 4 2 3

输入输出样例 #2

输入 #2

5 3
1 2
2 3
1 3

输出 #2

3
3 1 3 2
1 4
1 5

输入输出样例 #3

输入 #3

6 5
1 3
2 4
1 2
4 6
2 3

输出 #3

4
3 1 2 3
1 4
1 5
1 6

输入输出样例 #4

输入 #4

7 8
1 3
2 4
3 5
2 5
6 4
2 5
6 3
2 7

输出 #4

3
1 1
5 2 5 3 6 4
1 7

说明/提示

样例四解释:

相同颜色的点为同一个连通分量。


数据范围:
对于 \(100\%\) 的数据,\(1 \le n \le 5 \times10 ^5\)\(1 \le m \le 2 \times 10^6\)

subtask \(n\) \(m\) 分值
\(1\) \(1 \le n \le 100\) \(1 \le m \le 500\) \(25\)
\(2\) \(1 \le n \le 5000\) \(1 \le m \le 5 \times 10^4\) \(25\)
\(3\) \(1 \le n \le 2\times 10^5\) \(1 \le m \le 5\times 10^5\) \(25\)
\(4\) \(1 \le n \le 5 \times10 ^5\) \(1 \le m \le 2 \times 10^6\) \(25\)

数据更新

  • \(2022/7/14\) 加强数据
  • \(2022/11/26\) 新增 \(10\) 组较小的数据(\(1\le n, m \le 10\)),方便选手调试。
  • \(2022/12/31\) 重组 \(subtask\),并加入若干组极端数据。
  • \(2023/1/1\) 发现昨天新加入的数据数据出了问题,已修改。

本题不卡常,时间限制与空间限制均已开大,正确的解法均可通过。


惊喜:AC 后记得把鼠标放到测试点上看反馈信息,有惊喜哦。

#include<iostream>
#include<vector>
#include<stack>
#define int long long 
using namespace std;
struct edge{int x,y;
};
const int N=5*1e5+5;
int n,m,t=0,cnt=0,low[N],dfsn[N],a,b;
vector<edge>v;
vector<int>h[N];
vector<int>dcc[N];
stack<int>s;
void dfs(int x,int fa){low[x]=dfsn[x]=++t;s.push(x);for(int i=0;i<h[x].size();i++){int j=h[x][i],y=v[j].y;if(!dfsn[y]){dfs(y,j);low[x]=min(low[x],low[y]);if(low[y]>dfsn[x]){++cnt;while(1){int z=s.top();s.pop();dcc[cnt].push_back(z);if(z==y)break;}}}else if(j!=(fa^1))low[x]=min(low[x],dfsn[y]);}
}
signed main(){cin>>n>>m;for(int i=0;i<m;i++){cin>>a>>b;v.push_back({a,b});h[a].push_back(v.size()-1);v.push_back({b,a});h[b].push_back(v.size()-1);}for(int i=1;i<=n;i++){if(!dfsn[i]){dfs(i,0);}if(!s.empty()){++cnt;while(!s.empty()){dcc[cnt].push_back(s.top());s.pop();}}}cout<<cnt<<endl;for(int i=1;i<=cnt;i++){cout<<dcc[i].size()<<" ";for(int j:dcc[i])cout<<j<<" ";cout<<endl;}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/902658.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SvelteKit 最新中文文档教程(8)—— 部署 Node 服务端

前言 Svelte,一个语法简洁、入门容易,面向未来的前端框架。 从 Svelte 诞生之初,就备受开发者的喜爱,根据统计,从 2019 年到 2024 年,连续 6 年一直是开发者最感兴趣的前端框架 No.1:Svelte 以其独特的编译时优化机制著称,具有轻量级、高性能、易上手等特性,非常适合构…

第四篇:本地私有化部署大模型(Ollama、vLLM、LMDeploy)

魔塔社区平台介绍 量化:将高精度数值转换成低精度表示的过程(通常用于减少模型的内存和提高推理速度) Ollama部署大模型 linux安装miniconda# 下载 Miniconda 安装脚本 wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 运行安装脚本 bash…

用Adobe Illustrator编辑ArcGIS地图的方法

本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软件中进一步编辑地图,并最终导出为图片格式的结果文件的方法~本文介绍在ArcGIS下属的ArcMap软件中,将绘制好的地图导出为.ai或者.eps格式文件,并在Adobe Illustrator软…

协议版iM蓝号检测,批量筛选iMessages数据,无痕检测是否开启iMessage服务

一、实现iMessage数据检测的两种方式:1.人工筛选,将要验证的号码输出到文件中,以逗号分隔。再将文件中的号码粘贴到iMessage客户端的地址栏,iMessage客户端会自动逐个检验该号码是否为iMessage账号,检验速度视网速而定。红色表示不是iMessage账号,蓝色表示iMessage账号。2…

记录项目调用链路

记录项目调用链路 内容 要理清项目中执行链路的调用关系,可以通过以下工具分类实现,涵盖从代码静态分析到运行时动态追踪的全链路管理:一、代码层调用关系分析 1. 静态代码分析工具PyCallGraph(Python) 生成代码调用关系图,直观展示函数调用链路。 pip install pycallgra…

部署kibana

获取kibana安装包 [root@elk1 ~]# wget https://artifacts.elastic.co/downloads/kibana/kibana-7.17.28-amd64.deb[root@elk1 ~]# ls kibana-7.17.28-amd64.deb kibana-7.17.28-amd64.deb# 安装kibana [root@elk1 ~]# dpkg -i kibana-7.17.28-amd64.deb 配置kibana [root@elk…

多线程程序设计(四)——Balking

本文摘要了《Java多线程设计模式》一书中提及的 Balking 模式的适用场景,并针对书中例子(若干名称有微调)给出一份 C++ 参考实现及其 UML 逻辑图,也列出与之相关的模式。 ◆ 适用场景 当线程访问的共享数据没有准备好时,就放弃后续的操作。 ◆ 解决方案 在临界区中判断共享…

A preLaunchTaskC/C++:g++.exe 生成活动文件已终止,退出代码为1。找到一个有点呆的bug

之前突然弹出这个问题,百思不得其解,今天突然发现,因为之前顺便命名了一个c++文件用来暂时装代码的,名字叫做a.cpp,编译器编译的过程中会生成一个可执行文件叫做a.exe,就冲突了,太傻了:-(

2025/3/21 【二叉树】二叉树理论基础节笔记

代码随想录 解题过程中二叉树主要有两种形式: 1. 满二叉树2. 完全二叉树 优先级队列其实是一个堆,堆就是一棵完全二叉树,同时保证父子节点的顺序关系。 二、二叉搜索树 三、平衡二叉搜索树

C语言程序实验二

实验任务1:#include <stdio.h> #include <stdlib.h> #include <time.h>#define N 5int main() {int number;int i;srand(time(0));for(i = 0; i<N; ++i){number = rand()%100 +1;printf("20490042%04d\n", number);}return 0;} 问题1:生成一…

智慧工地合规穿戴监测系统

智慧工地合规穿戴监测系统基于计算机视觉的未佩戴安全帽检测算法通过实时视频流分析,可突破人工监管的物理局限,实现724小时全场景覆盖。该技术通过深度学习模型对人体姿态、头部特征进行精准识别,快速定位违规行为,为安全监管提供数据化、智能化的升级路径。核心算法模型采…

停车场立体车库人员滞留报警系统

停车场立体车库人员滞留报警系统采用AI算法,通过大量真实的场景样本训练后,能够在各种应用场景下及时准确的对场景中发生的人员入侵行为发出告警信息。通过对实时视频图像进行智能分析识别,可实现图像全屏周界防护、划定区域周界防护等功能。前端智能AI预警摄像机设备嵌入AI…