当前位置: 首页 > 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?
  • 前瞻|美联储明晨“按兵不动”几无悬念:关税战阴霾下,会否释放降息信号
  • 五月A股怎么买?券商金股电子权重第一,格力电器最热
  • 蓝佛安:中方将采取更加积极有为的宏观政策,有信心实现2025年的5%左右增长目标
  • 预告:央行等部门将发声,介绍“一揽子金融政策支持稳市场稳预期”有关情况
  • 怎样正确看待体脂率数据?或许并不需要太“执着”
  • 美政府称不再对哈佛大学提供联邦资助