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

P8436 【模板】边双连通分量

~~~~~      P8436 【模板】边双连通分量 ~~~~~      总题单

讲解

~~~~~      什么是边双连通分量?就是不包含割边的极大连通块。

~~~~~      怎么找边双连通分量?就是割边的时候将遍历到的点放到一个桶里,若当前边是割边,则在桶内且时间戳大于等于当前点的时间戳的点就是一个边双连通分量。

代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;ll head[4000005],egt=1;
struct Edge{ll v,nxt;}eg[4000005];
inline void adeg(ll u,ll v){eg[++egt]={v,head[u]};head[u]=egt;
}ll n,m,tot,cnt;
ll top,stk[500005];
vector<ll>pot[500005];
vector<pair<ll,ll>>bir;
ll dfn[500005],low[500005];void Tarjan(ll p,ll ineg){dfn[p]=low[p]=++tot;stk[++top]=p;for(ll i=head[p];i;i=eg[i].nxt){ll v=eg[i].v;if(!dfn[v]){Tarjan(v,i);low[p]=min(low[p],low[v]);if(low[p]>dfn[p])bir.push_back({p,v});}else if(i!=(ineg^1))low[p]=min(low[p],dfn[v]);}if(low[p]==dfn[p]){//重点 cnt++;while(top>=1){ll v=stk[top--];pot[cnt].push_back(v);if(v==p)break;}}
}signed main(){ios::sync_with_stdio(false);cin>>n>>m;while(m--){ll x,y;cin>>x>>y;adeg(x,y);adeg(y,x);}for(ll i=1;i<=n;i++)if(!dfn[i])Tarjan(i,0);cout<<cnt<<endl;for(ll i=1;i<=cnt;i++){cout<<pot[i].size()<<" ";for(ll it:pot[i])cout<<it<<" ";cout<<endl;}return 0;
}

~~~~~      引用请附名 —— —— —— OMG_NOIP


http://www.mrgr.cn/news/11385.html

相关文章:

  • 【JVM】OOM与调优(二)
  • 【C#】【EXCEL】Bumblebee/Classes/ExEnums.cs
  • 基层医疗云HIS系统源码:云计算、大数据等现代信息技术研发
  • ue5远程渲染和本地渲染的区别,及云渲染的联系
  • Linux——驱动——杂项设备
  • 文件.硬盘.IO
  • 服务器被渗透的表现及检测方法
  • CentOS7 mysql-cluster安装与配置
  • JMeter Plugins之内网插件问题解决
  • 二十三种模式之单例模式(基础了解)
  • coffee小程序怎么做 咖啡店小程序系统开发制作方法
  • 文件上传漏洞(看过就能学会)
  • Circuitjs 内存模块的使用
  • 培训第三十四天(初步了解Docker与套接字的应用)
  • 论文阅读笔记:T-Rex2: Towards Generic Object Detection via Text-Visual Prompt Synergy
  • Docker 部署 Kafka 可视化 Kafka-UI
  • VBA之正则表达式(47)-- 快速将公式转换为静态值计算
  • 【系统架构设计】测试评审方法
  • 什么是个股场外期权 532资质?散户怎么进行场外个股期权的交易?
  • K8S ConfigMaps