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

news/2024/12/23 7:55:51/

在这里插入图片描述

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.ppmy.cn/news/1526511.html

相关文章

图分类!!!

deepwalk 使用图中节点与节点的共现关系来学习节点的向量表示。那么关键的问题就是如何来描述节点与节点的共现关系&#xff0c;DeepWalk给出的方法是使用随机游走(RandomWalk)的方式在图中进行节点采样,RandomWalk是一种可重复访问已访问节点的深度优先遍历算法。给定当前访问…

机器学习1--概述

机器学习概述 一、概述二、发展历程三、主要分支四、工作流程五、算法分类六、模型评估 一、概述 人工智能的应用&#xff1a;交通、网络安全、电子商务、人工智能发展三要素&#xff1a;数据、算法、计算力。 CPU,GPU,TPUCPU主要适合I\O密集型任务GPU主要适合计算密集型任务 …

OpenCV结构分析与形状描述符(21)计算包围给定点集的最小面积三角形函数minEnclosingTriangle()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 找到一个包围二维点集的最小面积三角形&#xff0c;并返回其面积。 该函数找到一个包围给定的二维点集的最小面积三角形&#xff0c;并返回其面…

数据结构之栈(数组实现)

数据结构之栈 一、栈的概念与结构。 1、概念&#xff1a;栈是限定仅在表尾进行插入和删除操作的线性表。栈中的数据元素遵守后进先出原则&#xff0c;即LIFO(Last In First Out)的原则。 2、栈的插入操作&#xff1a;进栈/压栈/入栈 ​ 栈的删除操作: 出栈/弹栈 3、进栈出…

Java开发安全及防护

目录 一、开发安全 二、XSS介绍及防范措施 2.1何为XSS 2.2XSS分类 2.3常用方法 三、SQL注入介绍及防范措施 3.1何为SQL注入 3.2常用方法 四、重放介绍及防范措施 4.1何为重放 4.2常用方法 一、开发安全 在学习安全之前&#xff0c;我们首先学习漏洞&#xff0c;知道漏…

基于vue框架的宠物店管理系统的设计与实现4czn0(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,商品分类,服务类型,商品信息,商品订单,宠物服务,服务预约,服务评价,商品咨询 开题报告内容 基于Vue框架的宠物店管理系统的设计与实现开题报告 一、引言 随着宠物行业的蓬勃发展&#xff0c;宠物店作为宠物产品与服务的重要提供…

企微自动群发:高效营销与智能沟通的双重引擎

在数字化时代&#xff0c;企业营销与内部沟通的方式正经历着深刻的变革。企业微信&#xff08;简称“企微”&#xff09;作为企业级通讯与协作平台&#xff0c;凭借其强大的功能和稳定的运行环境&#xff0c;成为了众多企业实现高效营销与智能沟通的重要工具。其中&#xff0c;…

windows通过wsl2安装linux系统之Ubuntu,傻瓜式安装

期望通过每一次分享&#xff0c;让技术的门槛变低&#xff0c;落地更容易。 —— around 目录 1.基础环境和要求2.安装wsl23.安装linux系统4.迁移linux系统挂载5.配置linux账号密码6.配置ssh登录方式待续… 前言 为什么要在windows上安装linux&#xff0c;这个问题当你是研发…