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

NOIP2015提高组.信息传递

题目

517. 信息传递
在这里插入图片描述

算法标签: 并查集, T a r j a n Tarjan Tarjan算法, s c c scc scc强连通分量

思路

使用强连通分量算法求环上点的数量, 对每个连通分量求最小点数

T a r j a n Tarjan Tarjan算法求解代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>using namespace std;const int N = 200010, M = N;int n;
int head[N], ed[M], ne[M], idx;
int stk[N], top;
int low[N], dfn[N], timestamp;
int id[N], scc_cnt, cnt[N];
bool in_stk[N];void add(int u, int v) {ed[idx] = v, ne[idx] = head[u], head[u] = idx++;
}void tarjan(int u) {dfn[u] = low[u] = ++timestamp;stk[++top] = u, in_stk[u] = true;for (int i = head[u]; ~i; i = ne[i]) {int v = ed[i];if (!dfn[v]) {tarjan(v);low[u] = min(low[u], low[v]);}else if (in_stk[v]) low[u] = min(low[u], dfn[v]);}if (dfn[u] == low[u]) {++scc_cnt;int v;do {v = stk[top--];in_stk[v] = false;id[v] = scc_cnt;cnt[scc_cnt]++;}while (v != u);}
}int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);memset(head,-1, sizeof head);cin >> n;for (int i = 1; i <= n; ++i) {int t;cin >> t;add(i, t);}for (int i = 1; i <= n; ++i) {if (!dfn[i]) tarjan(i);}int ans = n;for (int i = 1; i <= scc_cnt; ++i) {if (cnt[i] > 1) ans = min(ans, cnt[i]);}cout << ans << "\n";return 0;
}
http://www.dtcms.com/a/142228.html

相关文章:

  • 工厂方法模式详解及在自动驾驶场景代码示例(c++代码实现)
  • AI象棋 3.0 |AI自动下象棋工具,破译残局,自动帮助下棋,内置视频教程
  • `peft`(Parameter-Efficient Fine-Tuning:高效微调)是什么
  • 跟我学C++中级篇——内存异常的分析
  • 自注意力机制self-attention
  • C++智能指针的知识!
  • 【HDFS入门】联邦机制(Federation)与扩展性:HDFS NameNode水平扩展深度解析
  • Ubuntu命令速查
  • Linux 文件查找终极指南:find, locate, grep 等命令详解
  • 原型模式详解及在自动驾驶场景代码示例(c++代码实现)
  • Flash存储器(一):接口标准全解析
  • z-library电子图书馆最新地址的查询方法
  • 多肽 N 端乙酰化有什么作用?
  • java八股之并发编程
  • 4月18日复盘
  • 定时器复习DSP【2025/4/18】
  • datasheet数据手册-阅读方法
  • MMAction2安装
  • Docker安装hoppscotch
  • 什么是MMOE?
  • 【统计显著性检验】
  • 考研单词笔记 2025.04.18
  • openEuler系统下源码编译安装Nginx实践教程
  • 关于GPU的涡轮散热与被动散热
  • Fastapi 日志处理
  • 医学教育视频会议系统私有化部署方案
  • rLLM - 使LLM的强化学习民主化
  • 《软件设计师》复习笔记(11.3)——需求获取、分析、定义、验证、管理
  • 每日一题---移动零
  • C# 点击导入,将需要的参数传递到弹窗的页面