首页 > 其他分享 >P8435 【模板】点双连通分量

P8435 【模板】点双连通分量

时间:2022-11-16 15:23:10浏览次数:77  
标签:点双 int scnt ++ dfn low now 模板 P8435

P8435 【模板】点双连通分量

#include <bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int M=4e6+6;

int h[N],ne[M],e[M],tot;
void add(int from,int to) {
    e[++tot]=to;
    ne[tot]=h[from];
    h[from]=tot;
}

int dfn[N],low[N],cnt;
int id[N],scnt;
stack<int>st;

vector<int>ans[N];

void tarjan(int now,int fa) {
    int son=0;
    dfn[now]=low[now]=++cnt;
    st.push(now);
    for(int i=h[now];i;i=ne[i]) {
        int to=e[i];
        if(dfn[to]==0) {
            son++;
            tarjan(to,now);
            low[now]=min(low[now],low[to]);
            if(low[to]>=dfn[now]) {
                scnt++;
                while(1) {
                    int k=st.top();
                    st.pop();
                    ans[scnt].push_back(k);
                    if(k==to)break;
                }
                ans[scnt].push_back(now);
            }
        }
        else if(to!=fa)low[now]=min(low[now],dfn[to]);
    }
    if(fa==0&&son==0)ans[++scnt].push_back(now);
}

int main() {
    int n,m;
    cin>>n>>m;
    while(m--) {
        int x,y;
        cin>>x>>y;
        add(x,y);
        add(y,x);
    }
    for(int i=1;i<=n;i++)
        if(dfn[i]==0) {
            while(st.size())st.pop();
            tarjan(i,0);
        }
    cout<<scnt<<endl;
    for(int i=1;i<=scnt;i++) {
        cout<<ans[i].size()<<' ';
        for(auto x:ans[i])cout<<x<<' ';
        cout<<endl;
    }
    return 0;
}

标签:点双,int,scnt,++,dfn,low,now,模板,P8435
From: https://www.cnblogs.com/basicecho/p/16895997.html

相关文章

  • Word13 《经费联审结算单》模板office真题
    1.根据题目一的要求,打开素材文件,点击【文件】-【另存为】,选择【当前文件夹】,命名为Word。   2.根据题目二的要求,在【布局】里点击【页面设置】的右下角,打开页面设......
  • C++模板——函数模板
    1.1定义函数模板1.2使用函数模板1.3两阶段翻译Two-PhaseTranslation1.3.1模板的编译和链接问题1.4多模板参数1.4.1引入额外模板参数作为返回值类型1.4.......
  • 算法基础:离散化及模板详解
    ⭐写在前面的话:本系列文章旨在复习算法刷题中常用的基础算法与数据结构,配以详细的图例解释,总结相应的代码模板,同时结合例题以达到最佳的学习效果。本专栏面向算法零基础但有......
  • <一>函数模板
    函数模板模板的意义:对类型也参数化intsum1(inta,intb){returna+b;}doublesum2(doublea,doubleb){returna+b;}几个概念函数模板模板的实例化模板函数模板......
  • SpringBoot 10: SpringBoot使用Thymeleaf模板引擎替代jsp
    Thymeleaf模板引擎简介Thymeleaf:是使用java开发的模板技术,在服务器端运行,把处理后的数据发送给浏览器模板是作视图层工作的,用来显示数据的Thymeleaf是基于Html语言的......
  • 压位高精度模板
    压位高精全家桶。原代码来自于知乎上人形魔芋的压位高精模板,进行了一些修改和改进。namespaceBigInteger{typedeflonglongll;typedefunsignedlonglong......
  • 模板:4个数码管动态显示精简方法
    示例:分秒表原始方法:查看代码unsignedcharSMG[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};voiddisp(unsignedintj,k){ P2=0XEF;//P24数码......
  • 势能分块模板
    分块:把n分成sqrt(n)块,中间整体修改,2边暴力修改即可,修改,查询的复杂度为3sqr(n);比线段树好写一些?当然整体的修改的时候,有时候要用lz去处理, 和势能线段树......
  • Spring Boot 导出EXCEL模板以及导入EXCEL数据(阿里Easy Excel实战)
    SpringBoot导出EXCEL模板以及导入EXCEL数据(阿里EasyExcel实战)导入pom依赖编写导出模板@ApiOperation("导出xxx模板")@GetMapping("/downTemplates")public......
  • vue源码分析-挂载流程和模板编译
    前面几节我们从newVue创建实例开始,介绍了创建实例时执行初始化流程中的重要两步,配置选项的资源合并,以及响应式系统的核心思想,数据代理。在合并章节,我们对Vue丰富的选项......