【图论】强连通分量

news/2024/12/2 17:57:24/

一.定义

 强连通分量(Strongly Connected Components,简称SCC)是图论中的一个概念,用于描述有向图中的一组顶点,其中任意两个顶点之间都存在一条有向路径。换句话说,对于图中的任意两个顶点u和v,如果存在一条从u到v的有向路径,同时也存在一条从v到u的有向路径,那么u和v就属于同一个强连通分量。

强连通分量在许多图算法中都有重要的应用,比如强连通分量的计算可以用于解决图的可达性问题、强连通分量的缩点可以用于求解最小生成树等。

注意:强连通分量是有向图!


 二.例题

P2661 [NOIP2015 提高组] 信息传递 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)


三.思路

我们可以易知可以求得最小环即可。也可以说要求最小强连通分量。

这里可以用tarjan算法实现


四.参考代码

#include<bits/stdc++.h>
#define maxn 200005
using namespace std;
int n,dfn[maxn],low[maxn],tot;
//链式前向星
int cnt,head[maxn];
struct Edge{int u,v,next;
}edge[maxn];
void add(int u,int v){edge[++cnt]=(Edge){u,v,head[u]}; head[u]=cnt;
}
vector<int> it[maxn];
int sta[maxn],ins[maxn],top,ls; //栈和是否入栈 
void tarjan(int u){dfn[u]=low[u]=++tot;sta[top++]=u;ins[u]=1;for(int i=head[u];i;i=edge[i].next){int v=edge[i].v;if(dfn[v]==0){tarjan(v);low[u]=min(low[u],low[v]);}else if(ins[v]){low[u]=min(low[u],dfn[v]);}}int j=0;//已经构成环 if(dfn[u]==low[u]){ls++;while(1){j=sta[--top];ins[j]=0;it[ls].push_back(j);if(u==j) break;}}
}
int main(){scanf("%d",&n);int k;for(int i=1;i<=n;i++){scanf("%d",&k);add(i,k);}for(int i=1;i<=n;i++){if(dfn[i]==0) tarjan(i);}int ans=0x7fffffff;for(int i=1;i<=ls;i++){int x=it[i].size();if(x>1) ans=min(ans,x);}cout<<ans;return 0;
}


http://www.ppmy.cn/news/997122.html

相关文章

前端(十一)——Vue vs. React:两大前端框架的深度对比与分析

&#x1f60a;博主&#xff1a;小猫娃来啦 &#x1f60a;文章核心&#xff1a;Vue vs. React&#xff1a;两大前端框架的深度对比与分析 文章目录 前言概述原理与设计思想算法生态系统与社区支持API与语法性能与优化开发体验与工程化对比总结结语 前言 在当今快速发展的前端领…

在排序数组中查找元素的第一个和最后一个位置——力扣34

文章目录 题目描述法一 二分查找 题目描述 法一 二分查找 int bsearch_1(int l, int r) {while (l < r){int mid (l r)/2;if (check(mid)) r mid;else l mid 1;}return l; }int bsearch_2(int l, int r) {while (l < r){int mid ( l r 1 ) /2;if (check(mid)) l …

大数据课程E4——Flume的Channel

文章作者邮箱:yugongshiye@sina.cn 地址:广东惠州 ▲ 本章节目的 ⚪ 了解Channel的作用和配置; ⚪ 掌握Channel的使用方法; ⚪ 掌握Channel的File Channel; ⚪ 掌握Channel的JDBC Channel; ⚪ 掌握Channel的Spillable Memory Channel; 一、Memory Ch…

2023爱分析·超自动化厂商全景报告|爱分析报告

关键发现 当前的超自动化定义主要从技术组合角度阐述超自动化内涵&#xff0c;较难和业务价值建立链接。爱分析对超自动化作如下新定义&#xff1a;超自动化指利用RPA、iPaaS、AI、低代码、BPM、流程挖掘等自动化技术&#xff0c;实现组织端到端流程自动化以及新业务流程快速编…

SAP RSA与RBA,业务需求与技术实现间的桥梁

1. 背景 SAP相关的缩略语很多&#xff0c;抛开背景说RSA与RBA&#xff0c;一定会让大家产生无数的联想。今年介绍的RSA与RBA是SAP最新企业架构方法论中的两个概念&#xff0c;听起来高大上&#xff0c;但其实其初衷和想法都是很容易理解的。话不多说&#xff0c;开始。 2. SA…

vue基础-key的作用

vue基础-key的作用 1、无key2、有key&#xff0c;值为索引3、有key&#xff0c;值为id 1、无key 最大限度尝试就地修改/复用相同类型元素 2、有key&#xff0c;值为索引 有key属性&#xff0c;基于key来比较新旧虚拟DOM&#xff0c;移除key不存在的元素 3、有key&#xf…

Git常见问题

git clone 提示OpenSSL SSL_read git clone 时提示Connection was reset, errno 10054类错误 fatal: unable to acce ss https://github.com/fex-team/ueditor.git/: OpenSSL SSL_read: Connection was reset, errno 10054 备注&#xff1a;以下方法只是归纳整理&#xff0c;…

【2023】无痕制作钓鱼邮件

当涉及到网络安全和信息保护时&#xff0c;钓鱼攻击一直是备受关注的话题。钓鱼攻击是一种利用社交工程手段欺骗用户&#xff0c;诱使其提供敏感信息或执行恶意操作的攻击方式。它不仅威胁个人用户的隐私和财产安全&#xff0c;也对组织和企业的机密信息构成严重威胁。为了增强…