P8436 【模板】边双连通分量
P8436 【模板】边双连通分量
题目描述
对于一个
输入格式
第一行,两个整数
接下来
不保证图为简单图,图中可能有重边和自环。
输出格式
第一行一个整数
接下来的
你可以以任意顺序输出边双连通分量与边双连通分量内的结点。
输入输出样例 #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
说明/提示
样例四解释:
相同颜色的点为同一个连通分量。
数据范围:
对于
subtask | 分值 | ||
---|---|---|---|
数据更新
加强数据 新增 组较小的数据( ),方便选手调试。 重组 ,并加入若干组极端数据。 发现昨天新加入的数据数据出了问题,已修改。
本题不卡常,时间限制与空间限制均已开大,正确的解法均可通过。
惊喜: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;
}
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合终身会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 提升Avalonia UI质感,跨平台图标库选型实践
· 突发,CSDN 崩了!程序员们开始慌了?
· C# 中委托和事件的深度剖析与应用场景
· 一个基于 .NET 8 + Ant Design Blazor 开发的简洁现代后台管理框架
· AppBox拖拽设计增删改查用户界面