当前位置: 首页 > news >正文

算法提高模板强连通分量tarjan算法

在这里插入图片描述

AC代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;
const int MOD = 998244353;
const int N = 2e5 + 10;//强联通分量模板
//tarjan算法
vector<int>e[N];
int n, m, cnt;
int dfn[N], low[N], ins[N], idx;
int bel[N];//记录每个点在哪一个强连通分量里
stack<int>stk;
vector<vector<int>>scc;
void tarjan(int u)
{dfn[u] = low[u] = ++ idx;//时间戳;ins[u] = true;//有没有被切掉stk.push(u);for(auto v : e[u]){if(!dfn[v]){tarjan(v);low[u] = min(low[u], low[v]);}else {if(ins[v]) low[u] = min(low[u], dfn[v]);}}if(dfn[u] == low[u])//一个强连通分量{vector<int>c;++cnt;//记录每个点到底在哪一个连通块里while(1){int v = stk.top();bel[v] = cnt;c.push_back(v);stk.pop();if(v == u) break;}sort(c.begin(), c.end());//题目要求字典序scc.push_back(c);//存下来每一个连通块}
}int main()
{cin >> n >> m;for(int i = 1; i <= m; i ++){int u, v;cin >> u >> v;e[u].push_back(v);}//有向边for(int i = 1; i <= n; i ++){if(!dfn[i]) tarjan(i);}sort(scc.begin(), scc.end());for(auto it : scc){for(auto c : it){cout << c << " ";}cout << endl;}
}

受欢迎的牛:

在这里插入图片描述

带注释的代码:

#include<bits/stdc++.h>using namespace std;typedef long long ll;
const int MOD = 998244353;
const int N = 2e5 + 10;//tarjan
vector<int>e[N];
int n, m, cnt;//cnt代表强连通分量的总数
int dfn[N];//记录时间戳;
int low[N];//记录每个连通块内的最小节点
int ins[N];//记录有没有被切割掉
int idx;//时间戳的标号
int bel[N];//记录每个点在哪一个强联通分量里
stack<int>stk;//储存每个强连通块的点
vector<vector<int>>scc;//储存每个强连通块
int outd[N];//储存每个强连通块的出度
int sz[N];//第i个强联通块的点数void  tarjan(int u)
{dfn[u] = low[u] = ++ idx;//记录时间戳ins[u] = 1;//记录遍历过了stk.push(u);//存点for(auto v : e[u]){if(!dfn[v]){tarjan(v);low[u] = min(low[u], low[v]);}else{if(ins[v])low[u] = min(low[u], dfn[v]);//记录连通块内的最小点,方便辨认是不是同一个连通块}}if(dfn[u] == low[u]){vector<int>c;//存每一个连通块的小数组++ cnt;//连通块的下标while(1){int v = stk.top();bel[v] = cnt;//记录每个点到底在哪一个连通块内sz[cnt] ++;//每个联通块点的数量c.push_back(v);stk.pop();if(u == v) break;//说明遍历完了该连通块}sort(c.begin(), c.end());//题目要求scc.push_back(c);//存下每个连通块}
}
int main()
{cin >> n >> m;//输入for(int i = 1; i <= m; i ++){int u, v;cin >> u >> v;e[u].push_back(v);//输入有向边}for(int i = 1; i <= n; i ++){if(!dfn[i]) tarjan(i);//对每一个点进行讨论,相当于求连通块然后在这部进行操作罢了}sort(scc.begin(), scc.end());//题目说按照最小字典序for(int u = 1; u <= n; u ++)//计算每一个点的出度{for(auto v : e[u]){if(bel[u] != bel[v]) outd[bel[u]] ++;//出度加1}}int cnts = 0, cntv = 0;for(int i = 1; i <= cnt; i ++){if(outd[i] == 0)//如果第i个强连通分量出度 == 0{cnts ++;cntv += sz[i];//则加上第i个强连通分量的点的个数}}if(cnts >= 2)//则不满足题意{puts("0");}else cout << cntv << endl;//满足条件的牛的个数
}

相关文章:

  • AIoTedge边缘计算+边缘物联网平台
  • sed awk 第二版学习(四)—— 基本 sed 命令
  • Matlab如何配置小波工具(Wavelet Toolbox)
  • C++ STL库的使用总结
  • 【项目】云备份
  • Oracle(122)如何进行控制文件的恢复?
  • Linux rm命令详解使用:掌握安全删除技巧
  • 多输入多输出 | Matlab实现SO-BP蛇群算法优化BP神经网络多输入多输出预测
  • PROTOTYPICAL II - The Practice of FPGA Prototyping for SoC Design
  • 身份证实名认证接口如何用C#实现
  • Ubuntu上安装与配置MySQL‌
  • 基于PHP的丽江旅游管理系统
  • TextCNN:文本卷积神经网络模型
  • leetcode-581. 最短无序连续子数组
  • MySQL高级功能-窗口函数
  • [NodeJS] 关于Buffer
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 3.7、@ResponseBody 和 @RestController
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript设计模式之工厂模式
  • miaov-React 最佳入门
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Theano - 导数
  • 从零开始的无人驾驶 1
  • 分布式熔断降级平台aegis
  • 基于web的全景—— Pannellum小试
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • Spring Batch JSON 支持
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • (7)STL算法之交换赋值
  • (PADS学习)第二章:原理图绘制 第一部分
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (五)关系数据库标准语言SQL
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • (转)【Hibernate总结系列】使用举例
  • (转)fock函数详解
  • (转)我也是一只IT小小鸟
  • .CSS-hover 的解释
  • .equals()到底是什么意思?
  • .Net - 类的介绍
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .Net mvc总结
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET 指南:抽象化实现的基类
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • /etc/fstab 只读无法修改的解决办法
  • /var/log/cvslog 太大
  • @Conditional注解详解
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)