洛谷 B3609 [图论与代数结构 701] 强连通分量 题解 tarjan算法

洛谷 P2812 校园网络(强连通分量, 缩点) 强连通分量, 缩点 阅读详情

[图论与代数结构 701] 强连通分量

题目描述

给定一张 n n n 个点 m m m 条边的有向图,求出其所有的强连通分量。

注意,本题可能存在重边和自环。

输入格式

第一行两个正整数 n n n , m m m ,表示图的点数和边数。

接下来 m m m 行,每行两个正整数 u u u 和 v v v 表示一条边。

输出格式

第一行一个整数表示这张图的强连通分量数目。

接下来每行输出一个强连通分量。第一行输出 1 号点所在强连通分量,第二行输出 2 号点所在强连通分量,若已被输出,则改为输出 3 号点所在强连通分量,以此类推。每个强连通分量按节点编号大小输出。

样例 #1

样例输入 #1

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

样例输出 #1

3
1 2 5 6
3
4

提示

对于所有数据, 1 ≤ n ≤ 10000 1 \le n \le 10000 1≤n≤10000, 1 ≤ m ≤ 100000 1 \le m \le 100000 1≤m≤100000。

原题

洛谷B3609——传送门

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
typedef long long ll;

const int MAX = 1e5 + 6;
vector<int> e[MAX];
int dfn[MAX]; // 时间戳:dfn[i]表示节点i第一次被访问的顺序
int low[MAX]; // 追溯值:low[i]表示从节点i出发所能访问到的最早时间戳
int tot;        // 时间戳编号
int sta[MAX];   // 栈
int insta[MAX]; // 是否在栈中
int top;        // 栈顶索引
int scc[MAX];   // 强连通分量编号
int siz[MAX];   // 强连通分量大小
int cnt;        // 第cnt个强连通分量

vector<int> scc_num[MAX]; // 每个强连通分量里的元素
int vis[MAX];             // 第i个节点所在强连通分量是否已经输出

void scc_tarjan(int x)
{
    // 进入x时,盖戳,入栈
    dfn[x] = low[x] = ++tot;
    sta[++top] = x;
    insta[x] = 1;
    for (int y : e[x])
    {
        if (!dfn[y]) // y尚未访问
        {
            scc_tarjan(y);
            low[x] = min(low[x], low[y]); // 回到x时更新low
        }
        else if (insta[y]) // 如果y已访问且在栈中
        {
            low[x] = min(low[x], dfn[y]); // 回到x时更新low
        }
    }
    // 离开x时,记录SCC
    if (dfn[x] == low[x]) // 如果x是所处SCC的根
    {
        int y;
        ++cnt;
        do
        {
            y = sta[top--];
            insta[y] = 0;
            scc[y] = cnt;
            scc_num[cnt].push_back(y);
            ++siz[cnt];
        } while (y != x);
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m;
    cin >> n >> m;
    int a, b;
    for (int i = 1; i <= m; i++)
    {
        cin >> a >> b;
        e[a].push_back(b);
    }
    for (int i = 1; i <= n; i++) //图可能不连通,所以需遍历所有节点
    {
        if (!dfn[i])
            scc_tarjan(i);
    }
    cout << cnt << '\n';
    for (int i = 1; i <= n; i++)
    {
        if (!vis[i])
        {
            sort(scc_num[scc[i]].begin(), scc_num[scc[i]].end()); //需按节点编号大小输出
            for (int j = 0; j < scc_num[scc[i]].size(); j++)
            {
                cout << scc_num[scc[i]][j] << " \n"[j == scc_num[scc[i]].size() - 1];
                vis[scc_num[scc[i]][j]] = 1; //标记已输出该节点
            }
        }
    }

    return 0;
}
题解:洛谷 B3609 [图论与代数结构 701] 强连通分量 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。号点所在强连通分量,以此类推。每个强连通分量按节点编号大小输出。号点所在强连通分量,若已被输出,则改为输出。第一行一个整数表示这张图的强连通分量数目。接下来每行输出一个强连通分量。条边的有向图,求出其所有的强连通分量。号点所在强连通分量,第二行输出。本文分享的必刷题目是从。,表示图的点数和边数。 阅读详情

相关推荐

数学建模学习方法-图论与代数结构.pdf

数学建模学习方法-图论与代数结构

图论与代数结构

文章目录基本概念图的概念图的代数表示道路与回路的判定哈密顿回路旅行商问题最短路径关键路径中国邮路问题树基本关联矩阵及其性质支撑树的计数回路矩阵与割集矩阵平面图与图染色图的平面性检测色数与色数多项式匹配与网络流网络流图的连通性代数系统半群群置换 基本概念 图的概念 多重图:含有重边的图 d+(v)d^+(v)d+(v):出度 支撑子图:G′G'G′是GGG的子图,且满足V′=VV'=VV′=V 导出子图:G′G'G′是GGG的子图,E′E'E′包含GGG在V′V'V′中所有的边 G1⊕G2=(V1∪V2,E1

fnoi2014xtx的博客 2712

Ubutntu下使用realsense d435i(二):获取某二维像素点的三维坐标

00 准备工作 准备工作包括安装驱动以及pyrealsense2,具体可参考上一篇: Ubutntu下使用realsense d435i(一):准备工作以及安装pyrealsense2 https://blog.youkuaiyun.com/gyxx1998/article/details/121461293 01 通过二维像素点获得物体三维坐标 这个在上一篇已经介绍了代码: realsense d435i获取某像素点三维坐标(计算深度和点云两种方法) https://blog.youkuaiyun.com/gyxx1998/

gyxx1998的博客 9943

(强连通分量)洛谷P2341【模板】强连通分量 / [HAOI2006]受欢迎的牛

洛谷P2341【模板】强连通分量 / [HAOI2006]受欢迎的牛 思路: 如题目描述,模板题。 花了两个小时看了tarjan,然后看了题目。what?excuse me?为啥跟我看到的东西感觉不太一样?然后看了大佬的题解,what?为啥叫容易看出,为啥我看不出? 啥叫强连通分量呢,简而言之,一个图的子图中任意两点可以相互到达。(就是构成了一个环)。 下面说tarjan算法。 其中两个重要的数组...

Z7784562的博客 917

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)【新手必看】挖漏洞流程指南,黑客手把手教你挖漏洞月入过万!收藏这篇就够了!(附学习笔记)

weixin_57514792的博客 1103

工业以太网通讯Profinet协议详解

Profinet是通过西门子控制系统被广泛使用的工业通信协议,是一种较新的,基于以太网的工业通讯协议。

mydatai的专栏 8851

(笔记整理未完成)【图论】强连通分量(一)——Tarjan算法

学习强连通分量的Tarjan算法

gzkeylucky的博客 371

【Scrapy】Scrapy教程4——命令行工具

Scrapy支持使用模块设置自己的项目命令。如何实现可参考的实践方法。然后在项目的settings文件中配置来添加自定义命令。以上就是对Scrapy命令行工具的说明,有不明确的地方,可参考官方文档欢迎大家在各大平台关注我,我会不定期发布技术相关文章和各种小工具,并且欢迎共同技术探讨!

jayhgq的博客 1249

B3609 [图论与代数结构 701] 强连通分量

原题传送门 Tarjan 算法 1. 什么是 Tarjan Tarjan 算法是一种用于求解有向图的强连通分量的算法,时间复杂度为 O(n+m)O(n + m)O(n+m)。它可以求出每个强连通分量的大小、属于其的顶点和强连通分量的总数。 2. 认识 dfs 生成树 dfs 生成树处理强连通分量的一个有力的工具:在 dfs 时,每当通过某条边 eee 访问到一个新节点 vvv,就加入这个点和这条边,最后得到的便是 dfs 生成树。 例如下面这张有向图: 它的 dfs 生成树可能是这样(黑色实线): 有向

orz 367

【首份】2023年30米分辨率土地利用遥感监测数据

为了恢复和重建我国土地利用变化的现代过程,更好地预测、预报土地利用变化趋势,地球资源数据云以美国陆地卫星Landsat 遥感影像数据作为主信息源,结合Sentinel系列数据,通过人工目视解译和机器学习方法,建立了国家尺度1:10 万比例尺多时期土地利用/土地覆盖遥感监测数据库(CNLUCC)因早期Landsat数据时空覆盖缺失,1972-1977年合成第一期数据,1978-1985年合成第二期数据,1986年起每年度生成一期数据。投影:Albers正轴等面积双标准纬线圆锥投影南标准纬线:25°N。

地球资源数据云的官方博客 3670

ESP32设备驱动-TM1637-驱动4位7段数码管

TM1637是一款带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成了MCU数字接口、数据锁存、LED高压驱动、键盘扫描等功能。 TM1637使用DIP20/SOP20封装,主要适用于电磁炉、微波炉、小家电的显示驱动。

视觉与物联智能 2117

c++ 图论-强连通分量 小总结

本文总结了求解有向图强连通分量的三种算法:Tarjan、Kosaraju和Garbow算法。Tarjan算法通过DFS遍历,利用dfn和low数组识别强连通分量;Kosaraju算法需要两次DFS,先在原图后序遍历,再在反图上处理;Garbow算法是Tarjan的变种,使用两个栈优化过程。文章还给出了洛谷P3387缩点问题的解法,通过将强连通分量缩点后拓扑排序求最大权值路径。三种算法各有特点,可根据需求选择使用。

wangluoqi的博客 999

科研必备:15款顶尖AI科研工具全面分析汇总(持续更新ing)

科研必备:15款AI科研工具全面分析汇总(持续更新ing)

Code_流苏:在代码中寻诗意,在实践中觅真知 9640

有向图的强连通分量

B3609 [图论与代数结构 701] 强连通分量 一些概念: 若一张有向图中任意两个节点 x,yx,yx,y,存在 xxx 到 yyy 的路径和 yyy 到 xxx 的路径,则称其为强连通图; 有向图的极大强连通子图被称为强连通分量。 在上文中,一个强连通子图 G′=(V′,E′)(V⊆V,E′⊆E)G'=(V',E')(V\subseteq V,E'\subseteq E)G′=(V′,E′)(V⊆V,E′⊆E) 极大,当且仅当不存在包含 G′G'G′ 的更大子图 G′′=(V′′,E′′)G''=

mango09の世界 432

DeFi核心协议代码解析

本文解析了DeFi两大核心协议Uniswap V2和Compound的智能合约架构与关键代码。Uniswap V2采用恒定乘积公式(x*y=k)实现自动做市,核心合约包括Factory、Pair和Router,具备流动性铸造、代币兑换和TWAP预言机功能。Compound借贷协议通过cToken合约管理存款和借款,采用动态利率模型和抵押率机制,包含资金利用率计算、清算触发等核心算法。两协议均采用模块化设计,通过智能合约实现去中心化金融服务的核心逻辑。

闲人编程的博客 934

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

强连通分量与缩点(Tarjan算法)(洛谷P3387)

强连通分量:有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通分量(strongly connected components)。

forezxl的博客 948

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

代数结构与图论

代数结构与图论

牛牛博士博客 3759

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

洛谷P2341 强连通分量

tarjan法求强连通分量,缩点

engineoid的博客 374

洛谷 P2341 受欢迎的牛(强连通分量)

题目链接: https://www.luogu.org/problemnew/show/P2341 题意: 给定一个有向图,如果aaa能到bbb,bbb能到ccc,那么aaa也能到ccc,问存在多少个这样的点,使得从所有点通过有向边都可以到达它,输出个数 分析: 首先考虑强连通量内任意两点可互相可达,那么如果强连通外的所有点都可以到达任意一个强连通内点,那么这个强连通分量的所有点都是属于结果的集合...

梧桐 418

【题解】间谍网络

题面 题目描述 由于外国间谍的大量渗入,国家安全正处于高度的危机之中。如果A间谍手中掌握着关于B间谍的犯罪证据,则称A可以揭发B。有些间谍收受贿赂,只要给他们一定数量的美元,他们就愿意交出手中掌握的全部情报。所以,如果我们能够收买一些间谍的话,我们就可能控制间谍网中的每一分子。因为一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。 我们的反间谍机关提供...

_BOSS_的博客 1213

tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

“tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----《膜你抄》 自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一直没有时间学习。这两天好不容易学会了,写篇博客,也算记录一下。 一、tarjan求强连通分量 1、什么是强连通分量? 引用来自度娘的一句话: “有向图强连通分量:在有向图G中,如...

weixin_30273931的博客 443

图论总复习

图的同构,最重要的判定依据是是否存在同构的导出子图。

斯坦福-MIT-Harvard-CMU 362

强连通分量+缩点

强连通分量+缩点

Unlimitedz的博客 241

洛谷P4782 【模板】2-SAT 问题(强连通分量)

原题 比如a为1或者b为1,那我们可以建两条确定边,就是!a -> b,!b -> a 。。然后就缩点,如果a和 !a 在同一个强连通分量中,那说明不可能。 如果答案存在呢,该怎么找布尔值呢。 ! 来自洛谷的截图。。当结论记住?。。 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<iostream> #include<algorithm> #include<stack> #in

weixin_45714726的博客 278

洛谷P1262 间谍网络(强连通分量 缩点)

传送门 满脑子都是刚学的 Tarjan ,看题的时候甚至不知道怎么操作特判 由题意可知,控制所有的间谍一定需要满足:所有入度为 0 的间谍都能够收买。而对于其他入度不为 000 的点,在满足了以上的条件之后,是一定可以通过入度为 000 的点到达的 (这不是显然的吗) 因此输出 NONONO 的情况仅为:存在入度为 000 的间谍不能够收买。由于该情况下还需要输出编号最小且不能控制的间谍,先缩点再处理会比较麻烦,考虑直接把所有能收买的放进 tarjantarjantarjan 中跑一遍后,第一个未更新 df

国家一级划水运动员的博客 298
上一篇: LibreOJ #10131. 「一本通 4.4 例 2」暗的连锁 题解 树上差分
下一篇: 洛谷 P10470 前缀统计 题解 字典树
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值