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

news2024/11/28 15:18:47

在这里插入图片描述

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.coloradmin.cn/o/2128219.html

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

相关文章

STL容器真的好用吗

大家都在用的c STL就一定是完美无缺的吗&#xff1f; 本文一针见血的指出常见STL顺序容器vector的致命bug。 在Scott Meyers的《Effective C》中&#xff0c;第一个条款明确指出&#xff0c;C是一个语言联邦。 这体现在&#xff1a; ● C&#xff1a;C继承了C语言的基础特性&a…

零基础学习Python(八)—— time模块、request模块、数据分析和自动化办公相关模块、jieba模块、文件操作和os相关模块的简单介绍

1. time模块 time()&#xff1a;获取当前时间戳&#xff0c;是一个数字 localtime()&#xff1a;返回一个time.struct_time对象&#xff0c;里面有年月日时分秒&#xff0c;还有星期几&#xff08;0表示星期一&#xff09;和今年的第几天 import timeprint(time.time()) pri…

我又被Spring的事务坑了,用户兑奖之后,什么东西都没收到!!

没错&#xff0c;我又被事务坑了&#xff01; 即上次的mq发送消息之后&#xff0c;业务代码回滚&#xff0c;导致发了一条中奖消息给用户&#xff01;&#xff01;&#xff0c;这次又被spring的事务坑了 这次是这样的&#xff0c;一个兑奖接口进来&#xff0c;我们先改变了这…

输入一段文字,瞬间生成应用。Furion低代码平台与AI协同工作,展现出非凡的效率与精准。

引言&#xff1a;展示问题背景 在当今快速变化的商业环境中&#xff0c;企业面临着前所未有的挑战。随着数字化转型的加速&#xff0c;企业对应用开发的需求日益增加。然而&#xff0c;传统的应用开发流程通常需要耗费大量时间和资源&#xff0c;从需求分析、设计、编码、测试到…

概念科普|ChatGPT是什么

一、引言 在人工智能的迅猛发展中&#xff0c;ChatGPT作为前沿技术的代表&#xff0c;其原理和运作方式成为了研究和讨论的热点。 常有观点将ChatGPT比喻为一种高级词语接龙&#xff0c;通过海量数据的学习与训练&#xff0c;机器能够根据给定的文本内容续写出下文&#xff0…

小米商业营销陈高铭:品牌应该多方整合,关注高质量营销 | SMARTIES CHINA 2024终审报道②

小米互联网业务部商业营销品牌总经理 陈高铭 近日&#xff0c;SMARTIES CHINA 2024终审活动在苏州音昱水中天落下帷幕。来自各行业的40位品牌广告主代表&#xff0c;历时两天时间&#xff0c;通过紧张的评审和精彩的讨论&#xff0c;从178个优秀入围案例中评选出了每个类别的金…

数据分析-螺旋环状气泡图

1 原理 采用阿基米德螺线原理&#xff0c;即以一个点匀速离开一个固定点的同时又以固定的角速度绕该固定点转动而产生的轨迹。具体原理见&#xff1a;阿基米德螺线。坐标轴公式为&#xff1a; 其中x为横坐标&#xff0c;y为纵坐标&#xff0c;r为离中心点的半径&#xff0c;为坐…

茶叶商家开店拓客线上发展增长生意

部分地区的人群酷爱喝茶&#xff0c;其他地区也有大量购茶者&#xff0c;其爱好者对茶叶的种类、年份季节口感度、价格等有着较高要求&#xff0c;花茶、绿茶、红茶、白茶、龙井、碧螺春、乌龙茶等&#xff0c;国内国外庞大市场&#xff0c;不能仅局限于本地附近客户&#xff0…

【ArcGIS】栅格计算器原理及案例介绍

ArcGIS&#xff1a;栅格计算器原理及案例介绍 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍案例案例1&#xff1a;计算栅格数据平均值 参考 栅格计算器&#xff08;Raster Calculator&#xff09;原理介绍 描述&#xff1a;在类似计算器的界面中&#xff0c;…

跨境独立站支付收款常见问题排雷篇1.0丨出海笔记

最近小伙伴们在社群讨论挺多关于独立站支付问题的&#xff0c;鉴于不少朋友刚接触独立站&#xff0c;我整理了一些独立站支付相关的问题和解决方案&#xff0c;供大家参考&#xff0c;百度网上一堆媒体的那些软文大家就别看了&#xff0c;都是软广或者抄来抄去&#xff0c;让大…

华为 昇腾 310P 系列 AI 处理器支持 140Tops 的 AI 算力。

1、产品简介 模组是基于昇腾 310P 系列 AI 处理器设计而成&#xff0c;可实现图像、视频等多种数据分析 与推理计算。超强的视频编解码能力以及支持 140Tops 的 AI 算力。在边缘侧及端侧的嵌入式计算 领域&#xff0c;有着极高的性价比&#xff0c;具有超强算力、 超高能效、…

2024最新版mysql数据库表的查询操作-总结

序言 1、MySQL表操作(创建表&#xff0c;查询表结构&#xff0c;更改表字段等)&#xff0c; 2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等)&#xff0c; 本节比较重要&#xff0c;对数据表数据进行查询操作&#xff0c;其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN…

产业互联网新星闪耀,“太行云商”引领传统产业数字化革命

产业互联网新星升起 晋城&#xff0c;作为我国能源及相关产业的重要基地&#xff0c;一直面临着信息协同不畅、存货供需失衡、资金融通困难等诸多挑战。 2023年&#xff0c;为了应对这些难题&#xff0c;晋城市政府携手AMT企源&#xff0c;成立了太行云商科技有限公司&#x…

【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】

生日视频制作教程蓝色飞机机身AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】蓝色飞机机身AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 下载AE模板 安装AE软件…

串口调试助手+串口打印配置

目录 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 2.打开main.c文件 在main函数中&#xff1a; 一、使用CUBE_MX配置串口 二、KEIL5配置 1.打开usart.c文件 UART_HandleTypeDef huart1;void MX_USART1_UART_Init(void) {/* USER CODE BEGIN USART1_Init 0 …

【Proteus51单片机仿真】YL-69湿度检测和继电器电机自启动

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于AT89C51单片机&#xff0c;湿度检测模块通过ADC0832数模转换器&#xff0c;将模拟信号转换为数字信号给单片机&#xff0c;然后通过LCD1602显示屏显示出当前的湿度值&#xff0c;并判断当前湿度值是…

大模型的第一个杀手级应用场景出来了

大家终于都意识到大模型首先改变的是软件行业自己&#xff0c;而软件的根基是代码生成。代码生成第一波就是AI辅助开发&#xff0c;这个会是大模型第一个杀手级应用。大家苦苦逼问自己的大模型杀手级应用&#xff0c;为什么会是辅助编程&#xff0c;这里说下什么&#xff1a; 必…

数据集 Total-Text 文本检测 >> DataBall

开源数据集 Total-Text 文本检测 深度学习 人工智能 Total-Text 是一个文本检测数据集&#xff0c;由 1,555 张图像组成&#xff0c;具有多种文本类型&#xff0c;包括水平、多向和弯曲文本实例。训练分割和测试分割分别有 1,255 张图像和 300 张图像。 article{CK2019, author…

时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测

时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测 目录 时序预测 | Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-CNN粒子群优化卷积神经网络时间序列预测&#xff08;完整源码和数…

新手教学系列——用Nginx将页面请求分发到不同后端模块

在当今的Web开发中,前后端分离架构已经成为主流,尤其是大型应用项目。前端可以通过Vue这样的框架来统一管理页面和用户交互,而后端则通常会拆分成多个微服务模块,以便应对不同业务需求和功能扩展。在这样的架构下,Nginx作为一个高效、灵活的Web服务器,能够帮助我们将前端…