算法:强连通分量(SCC) Tarjan算法

强连通分量,不能再加任何一个点了,再加一个点就不是强连通了

 

vector<int>e[N];
int dfn[N],low[N],tot;
bool instk[N];
int scc[N],siz[N],cnt;
void tarjan(int x){//入x时,盖戳,入栈dfn[x]=low[x]=++tot;q.push(x);instk[x]=true;for(auto y:e[x]){if(!dfn[y]){//若y尚未访问tarjan(y);low[x]=min(low[x],low[y]);//回x时更新low}else if(instk[y]){//若y已被访问且在栈中low[x]=min(low[x],dfn[y]);//更新low}}//离x时,记录SCCif(dfn[x]==low[x]){//若x是SCC的根int y;cnt++;do{y=q.top();q.pop();instk[y]=false;scc[y]=cnt;//SCC编号siz[cnt]++;//SCC大小}while(y!=x);}
}

[USACO06JAN] The Cow Prom S - 洛谷

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e4+10;
int dfn[N],low[N],tot;
bool instk[N];
int siz[N],cnt;
stack<int>q;
vector<vector<int>>e(N);
int n,m;
void tarjan(int x){dfn[x]=low[x]=++tot;q.push(x);instk[x]=true;for(auto v:e[x]){if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(instk[v]){low[x]=min(low[x],dfn[v]);}}if(dfn[x]==low[x]){int y;cnt++;do{y=q.top();q.pop();instk[y]=false;siz[cnt]++;}while(y!=x);}
}
void solve() {cin>>n>>m;while(m--){int a,b;cin>>a>>b;e[a].push_back(b);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}int ans=0;for(int i=1;i<=cnt;i++){if(siz[i]>1) ans++;}cout<<ans<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

 Trajan SCC缩点

 

我们加边的时候让出度为0的点指向入度为0的点,那么只要max(din,dout)即可

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e4+10;
int dfn[N],low[N],tot;
bool instk[N];
int scc[N],cnt;
int din[N],dout[N];//SCC的入度,出度
int n;
vector<vector<int>>e(N);
stack<int>q;
void tarjan(int x){dfn[x]=low[x]=++tot;q.push(x);instk[x]=true;for(auto v:e[x]){if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(instk[v]){low[x]=min(low[x],dfn[v]);}}if(dfn[x]==low[x]){int y;cnt++;do{y=q.top();q.pop();instk[y]=false;scc[y]=cnt;}while(y!=x);}
}
void solve() {cin>>n;for(int i=1,a;i<=n;i++){cin>>a;while(a){e[i].push_back(a);cin>>a;}}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);//一些点可能走不到,即图不连通}for(int x=1;x<=n;x++){//枚举n个点for(int y:e[x]){//枚举点x的邻边,x指向yif(scc[x]!=scc[y]){//如果x和y所在的强连通分量不一样,即不在同一个强连通分量之内din[scc[y]]++;//y所在的强连通分量的入度++dout[scc[x]]++;//x所在的强连通分量的出度++}}}int a=0,b=0;for(int i=1;i<=cnt;i++){if(!din[i]) a++;//a表示缩点后入度为0的个数if(!dout[i]) b++;//b表示缩点后出度为0的个数}cout<<a<<endl;if(cnt==1) cout<<0<<endl;//特判,如果只有一个强连通分量,那么就不用加边了else cout<<max(a,b)<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

[USACO03FALL / HAOI2006] 受欢迎的牛 G - 洛谷 

 AC代码:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e4+10;
int dfn[N],low[N],tot;
bool instk[N];
int scc[N],siz[N];
int cnt;
int dout[N];
vector<vector<int>>e(N);
stack<int>q;
int n,m;
void tarjan(int x){dfn[x]=low[x]=++tot;q.push(x);instk[x]=true;for(auto v:e[x]){if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(instk[v]){low[x]=min(low[x],dfn[v]);}}if(dfn[x]==low[x]){int y;cnt++;do{y=q.top();q.pop();instk[y]=false;scc[y]=cnt;siz[cnt]++;}while(y!=x);}
}
void solve() {cin>>n>>m;for(int i=0;i<m;i++){int a,b;cin>>a>>b;e[a].push_back(b);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}for(int x=1;x<=n;x++){for(auto y:e[x]){if(scc[x]!=scc[y]){dout[scc[x]]++;}}}int sum=0;int cnt1=0;for(int i=1;i<=cnt;i++){if(dout[i]==0){sum=siz[i];cnt1++;}}if(cnt1>1) sum=0;cout<<sum<<endl; 
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

【模板】缩点 - 洛谷

先缩点转化成一个无环图

 

团号逆序是拓扑序,因为我们给强连通分量标号的时候是从1开始标的,于是团号小的在拓扑序的末端,这样从大到小枚举团号即为拓扑序,保证是线性的,这样dp的话才能满足无后效性

AC代码:

#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e4+10;
int dfn[N],low[N],tot;
bool instk[N];
int scc[N],cnt;
int w[N],nw[N];
int n,m;
vector<vector<int>>e(N),ne(N);
stack<int>q;
int dp[N];
void tarjan(int x){dfn[x]=low[x]=++tot;q.push(x);instk[x]=true;for(auto v:e[x]){if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(instk[v]){low[x]=min(low[x],dfn[v]);}}if(dfn[x]==low[x]){int y;cnt++;do{y=q.top();q.pop();instk[y]=false;scc[y]=cnt;}while(y!=x);}
}
void solve() {cin>>n>>m;for(int i=1;i<=n;i++) cin>>w[i];for(int i=0;i<m;i++){int a,b;cin>>a>>b;e[a].push_back(b);}for(int i=1;i<=n;i++){if(!dfn[i]) tarjan(i);}for(int x=1;x<=n;x++){nw[scc[x]]+=w[x];//新点的权值for(int y:e[x]){if(scc[x]!=scc[y]){ne[scc[x]].push_back(scc[y]);}}}//缩点后建拓扑图for(int x=cnt;x>=1;x--){if(dp[x]==0){//若x为路的起点dp[x]=nw[x];}for(auto y:ne[x]){dp[y]=max(dp[y],dp[x]+nw[y]);}}int ans=0;for(int i=1;i<=cnt;i++) ans=max(ans,dp[i]);//可能图不连通,有多个强连通分量cout<<ans<<endl;
}
signed main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t=1;
//    cin>>t;while(t--) {solve();}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95521.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络-池化层和激活层

2.池化层 根据特征图上的局部统计信息进行下采样&#xff0c;在保留有用信息的同时减少特征图的大小。和卷积层不同的是&#xff0c;池化层不包含需要学习的参数。最大池化(max-pooling)在一个局部区域选最大值作为输出&#xff0c;而平均池化(average pooling)计算一个局部区…

新款UI动态壁纸头像潮图小程序源码

新款UI动态壁纸头像潮图小程序源码&#xff0c;不需要域名服务器&#xff0c;直接添加合法域名&#xff0c;上传发布就能使用。 可以对接开通流量主&#xff0c;个人也能运营&#xff0c;不需要服务器源码完整。整合头像&#xff0c;动态壁纸&#xff0c;文案功能齐全。 源码…

pyqt5使用经验总结

pyqt5环境配置注意&#xff1a; 安装pyqt5 pip install PyQt5 pyqt5-tools 环境变量-创建变量名&#xff1a; 健名&#xff1a;QT_QPA_PLATFORM_PLUGIN_PATH 值为&#xff1a;Lib\site-packages\PyQt5\Qt\plugins pyqt5经验2&#xff1a; 使用designer.exe进行设计&#xff1…

智慧公厕:将科技融入日常生活的创新之举

智慧公厕是当今社会中一项备受关注的创新项目。通过将科技融入公厕设计和管理中&#xff0c;这些公厕不仅能够提供更便利、更卫生的使用体验&#xff0c;还能够极大地提升城市形象和居民生活质量。本文将以智慧公厕领先厂家广州中期科技有限公司&#xff0c;大量的精品案例项目…

黑豹程序员-架构师学习路线图-百科:CSS-网页三剑客

文章目录 1、为什么需要CSS2、发展历史3、什么是CSS4、什么是SASS、SCSS 1、为什么需要CSS 作为网页三剑客的第二&#xff0c;CSS为何需要它&#xff0c;非常简单HTML只能完成页面的展现&#xff0c;但其做出来的页面奇丑无比。 随着网络的普及&#xff0c;人们的要求更高&…

cmip6数据处理之降尺度

专题一 CMIP6中的模式比较计划 1.1 GCM介绍全球气候模型&#xff08;Global Climate Model, GCM&#xff09;&#xff0c;也被称为全球环流模型或全球大气模型&#xff0c;是一种用于模拟地球的气候系统的数值模型。这种模型使用一系列的数学公式来描述气候系统的主要组成部分…

arm 汇编基础指令

实现1-100求和 .text .globl _start_start:mov r0, #1 i&#xff0c;i1mov r1, #100 条件变量i<100mov r2, #0 sumLoop: 循环cmp r0,r1 比较r0和r1的大小bhi stop 当r0>r1时&#xff0c;跳到stop标签a…

STM32G070RBT6-MCU温度测量(ADC)

1、借助STM32CubeMX生成系统及外设相关初始化代码。 在以上配置后就可以生成相关初始化代码了。 /* ADC1 init function */ void MX_ADC1_Init(void) {/* USER CODE BEGIN ADC1_Init 0 *//* USER CODE END ADC1_Init 0 */ADC_ChannelConfTypeDef sConfig {0};/* USER COD…

十天学完基础数据结构-第八天(哈希表(Hash Table))

哈希表的基本概念 哈希表是一种数据结构&#xff0c;用于存储键值对。它的核心思想是将键通过哈希函数转化为索引&#xff0c;然后将值存储在该索引位置的数据结构中。 哈希函数的作用 哈希函数是哈希表的关键部分。它将输入&#xff08;键&#xff09;映射到哈希表的索引位…

全志ARM926 Melis2.0系统的开发指引⑧

全志ARM926 Melis2.0系统的开发指引⑧ 编写目的12.5. 应用程序编写12.5.1. 简单应用编写12.5.1.1. 注册应用12.5.1.2. 创建管理窗口12.5.1.3. 实现管理窗口消息处理回调函数12.5.1.4. 创建图层12.5.1.5. 创建 framewin12.5.1.6. 实现 framewin 消息处理回调函数 -. 全志相关工具…

R语言教程课后习题答案(持续更新中~~)

R语言教程网址如下 https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/index.html 目录 source()函数可以运行保存在一个文本文件中的源程序 R向量下标和子集 数值型向量及其运算 日期功能 R因子类型 source()函数可以运行保存在一个文本文件中的源程序…

H5移动端购物商城系统源码 小型商城全新简洁风格全新UI 支持易支付接口

一款比较简单的 H5 移动端购物商城系统源码&#xff0c;比较适合单品商城、小型商城使用。带有易支付接口。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88391704 源码下载2&#xff1a;评论留言或私信留言

保险业SAP转型:奠定坚实的基础

保险业面临着许多新的挑战&#xff1a;从新的市场参与者到人工智能和物联网。如何在这种快节奏的现实中满足客户的需求&#xff0c;降低成本&#xff0c;加速增长&#xff1f;首先&#xff0c;让我们考虑一下数字化转型成功是什么样子的&#xff0c;以及如何实现它。在这篇文章…

克服网络安全压力:如何掌控无限的云数据

管理云中的数字风险比以往任何时候都更加重要。数字化转型引发的云数据呈指数级增长&#xff0c;为安全分析师创造了一个更大的威胁环境。随着威胁行为者继续危害组织最敏感的数据&#xff0c;这一挑战将会加剧。 预计未来五年全球网络犯罪成本将激增&#xff0c;从 2022 年的…

强化学习实践(二)Gym安装及环境搭建(代码可运行)

1.准备工作 优先选用conda&#xff0c;conda不仅可以安装python&#xff0c;也是环境管理的工具&#xff0c;我们可以通过conda创建python环境&#xff0c;每个环境之间是相互独立&#xff0c;这样不同的环境可以使用不同版本的python&#xff0c;不同版本的开发包&#xff0c;…

mysql技术文档--阿里巴巴java准则《Mysql数据库建表规约》--结合阿丹理解尝试解读--国庆开卷

阿丹&#xff1a; 国庆快乐呀大家&#xff01; 在项目开始前一个好的设计、一个健康的表关系&#xff0c;不仅会让开发变的有趣舒服&#xff0c;也会在后期的维护和升级迭代中让系统不断的成长。那么今天就认识和解读一下阿里的准则&#xff01;&#xff01; 建表规约 表达是…

unity脚本_Vector3 c#

接下来学习 相对世界坐标 首先我们给场景物体一个空物体 修改新建空物体名字为GameObjectFather 修改GameObjectFather坐标 修改GameObject2坐标 然后将GameObjectFahter设置成GameObject2的父物体 我们观察到子物体的坐标改变了但是 运行显示的相对世界坐标this.transform.po…

基于蝴蝶优化的BP神经网络(分类应用) - 附代码

基于蝴蝶优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于蝴蝶优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.蝴蝶优化BP神经网络3.1 BP神经网络参数设置3.2 蝴蝶算法应用 4.测试结果&#xff1a;5.M…

Apollo Planning2.0决策规划算法代码详细解析 (2): vscode gdb单步调试环境搭建

前言: apollo planning2.0 在新版本中在降低学习和二次开发成本上进行了一些重要的优化,重要的优化有接口优化、task插件化、配置参数改造等。 GNU symbolic debugger,简称「GDB 调试器」,是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端…

MySQL:数据库的物理备份和恢复-冷备份(3)

介绍 物理备份&#xff1a; 直接复制数据文件进行的备份 优点&#xff1a;不需要其他的工具&#xff0c;直接复制就好&#xff0c;恢复直接复制备份文件即可 缺点&#xff1a;与存储引擎有关&#xff0c;跨平台能力较弱 逻辑备份&#xff1a; 从数据库中导出数据另存而进行的备…