算法提高模板强连通分量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;//满足条件的牛的个数
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis高可用,Redis性能管理

文章目录 一&#xff0c;Redis高可用&#xff0c;Redis性能管理二&#xff0c;Redis持久化1.RDB持久化1.1触发条件&#xff08;1&#xff09;手动触发&#xff08;2&#xff09;自动触发 1.2 Redis 的 RDB 持久化配置1.3 RDB执行流程(1) 判断是否有其他持久化操作在执行(2) 父进…

Chainlit集成Langchain并使用通义千问实现文生图网页应用

前言 本文教程如何使用通义千问的大模型服务平台的接口&#xff0c;实现图片生成的网页应用&#xff0c;主要用到的技术服务有&#xff0c;chainlit 、 langchain、 flux。合利用了大模型的工具选择调用能力。实现聊天对话生成图片的网页应用。 阿里云 大模型服务平台百炼 API…

R语言统计分析——功效分析3(相关、线性模型)

参考资料&#xff1a;R语言实战【第2版】 1、相关性 pwr.r.test()函数可以对相关性分析进行功效分析。格式如下&#xff1a; pwr.r.test(n, r, sig.level, power, alternative) 其中&#xff0c;n是观测数目&#xff0c;r是效应值&#xff08;通过线性相关系数衡量&#xff0…

NAT技术+代理服务器+内网穿透

NAT技术 IPv4协议中&#xff0c;会存在IP地址数量不充足的问题&#xff0c;所以不同的子网中会存在相同IP地址的主机。那么就可以理解为私有网络的IP地址并不是唯一对应的&#xff0c;而公网中的IP地址都是唯一的&#xff0c;所以NAT&#xff08;Network Address Translation&…

跨平台集成:在 AI、微服务和 Azure 云之间实现无缝工作流

跨平台集成在现代 IT 架构中的重要性 随着数字化转型的不断加速&#xff0c;对集成各种技术平台的需求也在快速增长。在当今的数字世界中&#xff0c;组织在复杂的环境中执行运营&#xff0c;其中多种技术需要无缝协作。环境的复杂性可能取决于业务的性质和组织提供的服务。具…

Windows更新之后任务栏卡死?桌面不断闪屏刷新?

前言 小白这几天忙于工作&#xff0c;更新就变得异常缓慢。但就算这么忙的情况下&#xff0c;晚上休息的时间还是会给小伙伴们提供咨询和维修服务。 这不&#xff0c;就有一个小伙伴遇到了个很奇怪的问题&#xff1a;电脑Windows更新之后&#xff0c;任务栏点了没反应&#xf…

深入理解Java虚拟机:Jvm总结-Java内存区域与内存溢出异常

第二章 Java内存区域与内存溢出异常 2.1 意义 对于C、C程序开发来说&#xff0c;程序员需要维护每一个对象从开始到终结。Java的虚拟自动内存管理机制&#xff0c;让java程序员不需要手写delete或者free代码&#xff0c;不容易出现内存泄漏和内存溢出问题&#xff0c;但是如果…

概念——二连杆与三连杆解算

https://zhuanlan.zhihu.com/p/161348413 跟着这位大佬学的&#xff0c;侵权删除 计划&#xff1a;先行理解概念以及推演过程&#xff0c;然后自行推导一遍&#xff08;确认理解&#xff09;&#xff0c;之后思考如何实际调用&#xff0c;目前在第一步 目录 01-二连杆 1-正…

腾讯云2024年数字生态大会开发者嘉年华(数据库动手实验)TDSQL-C初体验

在2024年9月5-6日&#xff0c;有幸参加了腾讯云举办的2024年数字生态大会开发者嘉年华。 有幸体验了腾讯的多项黑科技和云计算知识。特别是在“增一行代码”互动展区&#xff0c;体验了腾讯云云计算数据库TDSQL-C技术并进行了动手实验。这些技术充分展示了腾讯在云计算的强大实…

关于OceanBase 多模一体化的浅析

在当今多元化的业务生态中&#xff0c;各行各业对数据库系统的需求各有侧重。举例来说&#xff0c;金融风控领域对数据库的高效事务处理&#xff08;TP&#xff09;和分析处理&#xff08;AP&#xff09;能力有着严格要求&#xff1b;游戏行业则更加注重文档数据库的灵活性和性…

购物车装载状态检测系统源码分享

购物车装载状态检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Comput…

有关WSL和docker的介绍

目录标题 如何利用在windows上配置docker实现linux和windows容器修改WSL默认安装&#xff08;也就是linux子系统&#xff09;目录到其他盘 如何利用在windows上配置docker实现linux和windows容器 wsl的基本命令&#xff1a;参考网页 docker入门到实践&#xff1a;参考网页 官方…

tekton pipeline workspaces

tekton pipeline workspace是一种为执行中的管道及其任务提供可用的共享卷的方法。 在pipeline中定义worksapce作为共享卷传递给相关的task。在tekton中定义workspace的用途有以下几点: 存储输入和/或输出在task之间共享数据secret认证的挂载点ConfigMap中保存的配置的挂载点…

影刀RPA实战:自动化批量生成条形码完整指南

今天我们聊聊使用影刀来实现批量生成条形码&#xff0c;条形码在零售行业运用非常广泛&#xff0c;主要作用表现在产品识别&#xff0c;库存管理&#xff0c;销售管理&#xff0c;防伪保护等&#xff0c;这些作用使其成为现代商业和工业环境中不可或缺的工具&#xff0c;它极大…

力扣题/回溯/单词搜索

单词搜索 力扣原题 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那…

二叉树--

1.建立并遍历二叉树 遍历顺序&#xff1a; 先序遍历&#xff0c;中序遍历&#xff0c;后序遍历 先序&#xff1a;先根后左右 中序&#xff1a;先左然后根最后右 后序&#xff1a;先左右后根 例如&#xff1a; 先序&#xff1a;ABCDEFGH 中序&#xff1a;BDCEAFHG 后序&am…

JAVA基础:抽象类,接口,instanceof,类关系,克隆

1 JDK中的包 JDK JRE 开发工具集&#xff08;javac.exe&#xff09; JRE JVM java类库 JVM java 虚拟机 jdk中自带了许多的包&#xff08;类&#xff09; &#xff0c; 常用的有 java.lang 该包中的类&#xff0c;不需要引用&#xff0c;可以直接使用。 例如&#xff1…

ARM32开发——GD32F4 DMA功能查询

&#x1f3ac; 秋野酱&#xff1a;《个人主页》 &#x1f525; 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 DMA0DMA1 DMA0 DMA1

【Linux修行路】线程安全和死锁

目录 ⛳️推荐 一、线程安全 1.1 常见的线程不安全情况 1.2 常见的线程安全情况 1.3 常见的不可重入情况 1.4 常见可重入的情况 1.5 可重入与线程安全的联系 1.6 可重入与线程安全的区别 二、死锁 2.1 死锁的四个必要条件 2.2 如何避免产生死锁&#xff1f; ⛳️推荐…

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系…