首页 > 其他分享 >【笔记】模板整理以及警钟长鸣

【笔记】模板整理以及警钟长鸣

时间:2024-08-02 18:27:43浏览次数:12  
标签:ch 笔记 int SCC 警钟长鸣 while scc 模板 low

图论部分

\(\text{I}\). 连通性部分

有向图强连通分量 \(\text{(SCC)}\)

代码模板

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
int n, m, num, scc_cnt, top;
bool instk[N];
int dfn[N], low[N], stk[N], blg[N];
vector<int> g[N], ans_scc[N], new_g[N];
inline int read(){
    int s = 0, w = 1;
    char ch = getchar();
    while(!isdigit(ch)) { w = (ch == '-' ? -1 : 1); ch = getchar(); }
    while(isdigit(ch)) { s = s * 10 + ch - '0'; ch = getchar(); }
    return s * w;
}
inline void write(int x){
    if(x < 0) { x = -x, putchar('-'); }
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}
void scc(int u){
    dfn[u] = low[u] = ++num;
    stk[++top] = u, instk[u] = true;
    for(int v : g[u]){
        if(!dfn[v]){
            scc(v);
            low[u] = min(low[u], low[v]);
        }else if(instk[v])
            low[u] = min(low[u], dfn[v]);
    }
    if(dfn[u] == low[u]){
        scc_cnt++;
        int t;
        do{
            t = stk[top--];
            instk[t] = false;
            ans_scc[scc_cnt].push_back(t), blg[t] = scc_cnt;
        }while(t != u);
    }
}
int main(){
    n = read(), m = read();
    while(m--){
        int u = read(), v = read();
        if(u != v)
            g[u].push_back(v);
    }
    for(int i = 1; i <= n; i++)
        if(!dfn[i])
            scc(i);
    // 输出每个 SCC 的元素
    for(int i = 1; i <= scc_cnt; i++){
        printf("SCC #%d : %d elements : ", i, ans_scc[i].size());
        sort(ans_scc[i].begin(), ans_scc[i].end());
        for(int u : ans_scc[i])
            printf("%d ", u);
        printf("\n");
    }
    // 缩点
    for(int i = 1; i <= n; i++)
        for(int j : g[i])
            if(blg[i] != blg[j])
                new_g[blg[i]].push_back(blg[j]);
    // 输出缩点之后的新图
    printf("New graph :\n");
    for(int i = 1; i <= scc_cnt; i++)
        for(int j : new_g[i])
            printf("SCC #%d -> SCC #%d\n", i, j);
    return 0;
}

注意:

  1. 在判断一条边是不是 B 边或有用的 C 边时,需要判断这条边指向的点是否在栈中。
  2. 在求出 SCC 之后,清理栈的时候 while 循环至少需要执行一次,这也是使用 do...while 循环的原因。
  3. 在求出 SCC 之后,清理栈的时候要把 instk[t] 重置成 false,代表栈顶的 top 也要减一。但注意,应该先取栈顶元素再自减,也就是后自减,这与前文入栈时用的是先自增再入栈(即前加)有关。因为这导致了 top 指向的元素就是栈顶,而不是栈顶元素 $ + 1$。
  4. 缩点的时候如果要处理 SCC 之间的连边,需要先判断这条边的两个端点是不是不在一个 SCC 中。这是因为一个 SCC 内部的连边不是几个 SCC 之间的连边。
  5. SCC 只适用于有向图。如果是无向图,那么与 SCC 定义类似的是 EDCC 和 VDCC。

标签:ch,笔记,int,SCC,警钟长鸣,while,scc,模板,low
From: https://www.cnblogs.com/-Prulystic-/p/18338529

相关文章

  • 苹果cmsv10酷黑模板模板 视频网站源码自适应模板【带有广告位】
    探索苹果CMSV10酷黑模板:打造高端自适应视频网站的完美选择在当今数字化时代,视频网站已成为人们休闲娱乐、获取信息的重要渠道之一。而一个精美、高效且用户友好的视频网站模板,则是吸引访客、提升用户体验的关键。今天,我们将带您深入了解苹果CMSV10的酷黑模板,这款集美观性、......
  • CSAPP笔记:Lecture 02 Bits, Bytes and Integer
    位移操作二进制优势在于容易表示、抗干扰等,在表示模拟信号的时候也有优势。运算符&,|,!&&,||,!!>>,<<:位移运算又分为逻辑位移、算术位移,其中理解算数右移需要理解计算机内如何表示负数.位移实验移动的位数等于int的位数(4bytes*8=32bis),结果不变。如果是3......
  • SpringCloud入门学习笔记(四)
    Sentinel篇 SpringCloud入门学习笔记(一)-CSDN博客SpringCloud入门学习笔记(二)-CSDN博客SpringCloud入门学习笔记(三)-CSDN博客前言 在互联网应用过程中,有很多的高并发访问场景,类似于双十一这种活动,特点是访问量剧增,访问量超出系统所能处理的最大并发数。 如果没有保护机......
  • SpringCloud入门学习笔记(三)
    Nacos篇SpringCloud入门学习笔记(二)-CSDN博客SpringCloud入门学习笔记(一)-CSDN博客前言  上篇中提到服务消费者要去调用多个服务提供者构成的集群,此时需要一个三方软件来同步更新提供者的地址信息,同时供服务消费者来此处访问地址,为了解决这类问题,就需要引入服务注册组件(功......
  • 模电笔记——半导体二极管及其基本电路
        tips:本章节的笔记已经打包到word文档里啦,建议大家下载文章顶部资源(手机端下载后里面的插图可能会乱,建议电脑下载,兼容性更好且易于观看),若有不足之处请多多包含,大家可以评论指正或给出建议。    在讲之前先允许我浅谈一下电子技术相关概念与模拟电子系统的......
  • 苍穹外卖项目--学习笔记
    苍穹外卖学习文档软件开发整体介绍软件开发流程需求分析需求规格说明书、产品原型设计UI设计、数据库设计、接口设计编码项目代码、单元测试测试测试用例、测试报告上线运维软件环境安装、配置角色分工项目经理对整体项目负责,任务分配、把控进度产品经理进行......
  • 【C++】学习笔记——智能指针
    文章目录二十一、智能指针1.内存泄漏2.智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器未完待续二十一、智能指针1.内存泄漏在上一章的异常中,我们了解到如果出现了异常,会中断执行流,跳转到catch处。但......
  • 【C++】学习笔记——特殊类的设计
    文章目录二十二、特殊类的设计1.请设计一个类,不能被拷贝2.请设计一个类,只能在堆上创建对象3.请设计一个类,只能在栈上创建对象4.请设计一个类,不能被继承5.请设计一个类,只能创建一个对象(单例模式)未完待续二十二、特殊类的设计1.请设计一个类,不能被拷贝拷贝......
  • Pytorch笔记|小土堆|P10-13|transforms
    transforms对图像进行改造最靠谱的办法:根据help文件自行学习transforms包含哪些工具(类)以及如何使用————————————————————————————————————自学一个类时,应关注:1、如何使用各种工具(类)的使用思路:创建对象(实例化)——>传入参数,调用函数(如有__......
  • 【笔记】计数选讲:容斥、LGV、集合幂级数、GF 2024.8.2
    今天写的很乱。[HEOI2013]SAO容斥。因为我们已经知道父亲\(<\)儿子时的情况(\(n!/\prod_isiz_i\),也适用于森林),那么儿子\(<\)父亲的情况就容斥掉,无限制的就当作那条边不存在。树上背包,记录当前节点为根的连通块大小和容斥系数的积。*[ECFinal23A]DFSOrder4转写为:统计多......