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

【拓扑排序+dfs】P2661 [NOIP 2015 提高组] 信息传递

题目

P2661 [NOIP 2015 提高组] 信息传递
在这里插入图片描述

分析

首先根据示例1进行分析,可以得出以下信息传递的关系图:
请添加图片描述
我们可以发现,2、3、4之间存在一个环,这个环的长度是3,那么意味着在3轮信息传递之后游戏就会结束。
这么分析之后问题就变得简单了,我们只需要通过拓扑排序找到整个关系图中的环,然后dfs环中的某一个结点(拓朴排序后未被标记的结点),然后计算出环的长度,并且要找到最短的那个环长,这样就知道游戏能进行多少轮了。

代码

#include<iostream>
#include<queue>using namespace std;const int N = 2e5 + 10;int ne[N], in[N]; //ne存结点的后继,in存结点的入度 
//为什么本题不用vector存i的出边信息,因为本题中每个结点i只有一条出边,入边可以有多条 bool st[N];int cnt;void dfs(int u)
{cnt++;st[u] = true;int v = ne[u];if(!st[v]) dfs(v); //我准备特殊判断ne[x]不能为0的,但是输入格式保证ne[x]不会出现0 }int main()
{int n; cin >> n;for(int i=1;i<=n;i++) //记录关系 {cin >> ne[i];in[ne[i]]++;}//拓扑排序queue<int> q;//把所有入度为0的点加入队列 for(int i=1;i<=n;i++){if(in[i] == 0) {q.push(i);st[i] = true; //也可以不标记,初初始入度为0的点不会被其他点指向,所以它们不会在拓扑排序中被标记,但由于它们不在环中,后续DFS也不会处理它们}} while(q.size()){auto u = q.front(); q.pop();int v = ne[u]; //删掉入度为0的结点的边 in[v]--;if(in[v] == 0) {q.push(v);st[v] = true;}		} //最后遍历所有结点,如果有没入队的,就存在环,进行dfs求最短环长 int ret = n;for(int i=1;i<=n;i++){if(!st[i]) {cnt = 0;dfs(i);ret = min(ret,cnt);}} cout << ret << endl;return 0;} 
http://www.dtcms.com/a/277508.html

相关文章:

  • 线下门店快速线上化销售四步方案
  • 在i.MX8MP上如何使能BlueZ A2DP Source
  • 如何设计高并发架构?深入了解高并发架构设计的最佳实践
  • Nature子刊 |HERGAST:揭示超大规模空间转录组数据中的精细空间结构并放大基因表达信号
  • DETRs与协同混合作业训练之CO-DETR论文阅读
  • Pandas 的 Index 与 SQL Index 的对比
  • Flask中的路由尾随斜杠(/)
  • SQL140 未完成率top50%用户近三个月答卷情况
  • react中为啥使用剪头函数
  • (nice!!!)(LeetCode 面试经典 150 题 ) 30. 串联所有单词的子串 (哈希表+字符串+滑动窗口)
  • win10 离线安装wsl
  • 论文翻译:Falcon: A Remote Sensing Vision-Language Foundation Model
  • 26-计组-数据通路
  • 楼宇自动化:Modbus 在暖通空调(HVAC)中的节能控制(一)
  • Linux驱动开发1:设备驱动模块加载与卸载
  • java+vue+SpringBoo中小型制造企业质量管理系统(程序+数据库+报告+部署教程+答辩指导)
  • 查看Linux服务器显卡使用情况的详细教程
  • win11添加无线显示器(两个笔记本实现双屏)
  • 昇腾FAQ-A08-工具链相关
  • 小架构step系列13:测试用例的加载
  • 线性代数学习笔记
  • 求解线性规划模型最优解
  • Java行为型模式---观察者模式
  • AI基础设施展望
  • 《Mirage:首款基于实时世界模型的AI原生UGC游戏引擎,开启“边玩边生成”的游戏新时代》
  • Python实现小红书悬停框效果详解
  • 极矢量与轴矢量
  • 框架和库的区别
  • MCP4725 数据手册解读
  • 通信子网 V