当前位置: 首页 > 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;
}

相关文章:

  • 工厂方法模式详解及在自动驾驶场景代码示例(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?
  • 加快从数量增长向品质跃升转变,促进生态空间与城市功能有机共生!龚正调研公园城市建设工作
  • 海康威视:去年海外主业和机器人等创新业务占比首次超50%
  • 老总们带着产品直奔对接会,外贸拓内销找到更多“新路子”
  • 龚桢梽任广东省发展和改革委员会副主任
  • 董军与越南国防部长共同主持中越边境国防友好交流活动
  • 梅宏院士:数实共生将改写社会经济运行规则