目录

Description

思路

代码


Description

小张是一位推理迷,他非常喜欢看侦探小说与侦探电影。同时他也会玩一些推理游戏,在侦探游戏中,小张需要发掘事件之间的联系。通过一条线索,他能够通过事件A推理出事件B。如果通过某一个事件A能够推出事件A本身,那么他就能够完成推理。现在按照顺序给出 m 条线索,请你算出他最少能够用前几条线索能够形成逻辑闭环完成推理。

Input 第一行 n,m(1 \leq n,m \leq 300000 ) 两个数,表示事件数和线索数。 接下来 m 行,每行两个数 A,B(1 \leq A,B \leq n ) ,表示事件A能够推出事件B。

Output 一行一个数,表示最少能够用前几条线索形成逻辑闭环完成推理。若无法完成输出-1。

思路

仍然是bfs。

其实这类题说简单就一个bfs,但是细节会有很多变化。

比如之前的22出现非最短步数情况。

这道24又多了很多细节:

  1. 逻辑闭环不需要记录首尾,只要前几个中有可以构成闭环的数字即可
  2. 既然是闭环,那么任何数都可以当做开头,所以你从A搜到B可以,也可以从B搜到A
  3. 我们怎么确定哪一个在闭环里?难道是建立一个数组储存前几个读入的,然后每读入一个数,就对整个数组中每一个数都bfs一次?太累了,绝对TLE。不妨优化一下:假设前n-1个数不能形成闭环,而有了第n对数就形成闭环,说明第n对数必然在闭环内,这样每次读入一个新的数就bfs一次即可。
  4. 照着这个思想,我第一次TLE掉4个hhh,如果算法没有什么问题,或者说同样的算法别人能过你就不能过 ,那必然是你多了很多冗杂的步骤,之后就开始分析。
  5. 此题不要求最短步数,所以其实只要能形成逻辑闭环即可,不需要用vis数组计步,用vis数组的话需要判断,memset,都是浪费时间。
  6. 具体思路框架在代码里找吧

代码

TLE掉4个的版本

#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#define SIZE 300010
//int step[SIZE];
int cause[SIZE] = { 0 };
int result[SIZE] = { 0 };
int step;
std::map<int, std::vector<int>> graph;
std::queue<int> q;
bool bfs(int h2, int h1,bool vis[]);
int main(void)
{
// freopen("input.txt", "r", stdin); int n, m, temp1, temp2; scanf("%d %d", &n, &m); for (step = 1; step <= m; step++) { bool vis[SIZE] = { false }; scanf("%d %d", &temp1, &temp2); graph[temp1].push_back(temp2); if (bfs(temp2, temp1, vis))//满足之前出现过的条件才bfs { printf("%d\n", step); return 0; } } //走到这里就是没有结果了 printf("-1\n"); return 0;
}
bool bfs(int h2,int h1,bool vis[])//从结尾bfs到第一个的开头
{ int top = h2; q.push(h2); while (!q.empty()) { //取出 top = q.front(); q.pop(); //放入邻居 for (auto x : graph[top]) { if (x == h1) //找到逻辑闭环 return true; if (!vis[x]) { q.push(x); vis[x] = true; } } } //最后空了,就是bfs失败 return false;
}

去掉冗杂步骤ac版本

#include<cstdio>
#include<cstring>
#include<map>
#include<vector>
#include<queue>
#define SIZE 300010
int step;
std::map<int, std::vector<int>> graph;
std::queue<int> q;
bool bfs(int h2, int h1);
int main(void)
{//freopen("input.txt", "r", stdin); int n, m, temp1, temp2;scanf("%d %d", &n, &m);for (step = 1; step <= m; step++){scanf("%d %d", &temp1, &temp2);graph[temp1].push_back(temp2);if (bfs(temp2, temp1))//满足之前出现过的条件才bfs {printf("%d\n", step);return 0;}}//走到这里就是没有结果了 printf("-1\n");return 0;
}
bool bfs(int h2, int h1)//从结尾bfs到第一个的开头
{int top = h2;q.push(h2);while (!q.empty()){//取出 top = q.front();q.pop();//放入邻居 for (auto x : graph[top]){if (x == h1) //找到逻辑闭环 return true;q.push(x);}}//最后空了,就是bfs失败 return false;
}

【第二十四题】逻辑闭环(北理工/北京理工大学/程序设计方法与实践/小学期 )相关推荐

  1. 【第十四题】水晶球|贪心(北理工/北京理工大学/程序设计方法与实践/小学期 )

    目录 Description 思路: 几个点: 代码: Description 直接c v过来的,有很多符号,懒得改了,仅为搜索引擎而放进来) 和许多同龄女孩子一样,久莲也喜欢水晶球.  还有 10 ...

  2. 【第十九题】填坑II(北理工/北京理工大学/程序设计方法与实践/小学期 )

    Description emmm,还是北湖深坑,不用惊喜,不用意外  我们继续用石头填!  北湖的地面依旧是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示.  还是提供不限量的 1 乘號 ...

  3. 【第二十三题】带旋转的数独游戏|dfs(北理工/北京理工大学/程序设计方法与实践/小学期 )

    目录 ​ 前言 dfs学习 思路 代码修正 源代码 我修正后的代码 前言 说实话这题我弄的也不是很明白,而csdn上只有一份代码@loveumozart,还没多少注释,关键还有很多冗余代码,于是我就做 ...

  4. 华科计算机考研和北理工,北京理工大学和华中科技大学比较起来,该报哪一所?...

    第一.如果从地理位置来看,建议选择北京理工大学 北京和上海是学子们最想去的两个城市,不论是读书还是上班,都是非常好的一个选择.武汉相比来说,这个城市的水平低一个档次. 第二.如果想升学,建议选择北京理 ...

  5. 第二十四题——[ZJCTF 2019]NiZhuanSiWei

    题目地址:https://buuoj.cn/challenges 解题思路 第一步:进入题目,展示了php代码 第二步:使用data协议绕过text参数检测 经过代码分析,text参数不能为空,且根据 ...

  6. 经典算法题每日演练——第二十四题 梳排序

    这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同 ...

  7. 大学计算机实验五北理工,北京理工大学计算机实验五报告表

    实验五实验报告表 实验名称: 学号:姓名:班级:实验时间: 实验报告表5–1进程同步实验观察结果记录表 进程1 操作步数进程1状态转换情况记录 1进程1申请资源A1个 2操作系统返回进程1资源A1个 ...

  8. 第四章第二十六题(金融应用:货币单位)(Financial application: monetary units)

    第四章第二十六题(金融应用:货币单位)(Financial application: monetary units) *4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为i ...

  9. 第十四题: 以下代码的输出结果是?

    第十四题: 以下代码的输出结果是? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class B {     public static B t1 = n ...

最新文章

  1. 步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)
  2. 报道称:Check Point正在洽谈收购CyberArk
  3. 配置深度学习环境的重要资料
  4. 怎样在vue单页面中引入其他组件
  5. Gradle build设置自动log开关
  6. “10亿赌约”董明珠赢了!格力电器2018年总收入超2000亿
  7. 谁是真凶?《CSI:犯罪现场调查》正帮助AI提高断案能力
  8. ehcache 手动刷新缓存_清空DNS缓存的两个小方法
  9. GID绘图和CDC类
  10. “21天好习惯”第一期-13
  11. HTTP协议响应头之Transfer-Encoding:分块传输详解
  12. 外省市机动车驾驶证换领本市机动车驾驶证
  13. 人工智能 机器学习 数据挖掘 数据分析 算法大全
  14. android全屏状态栏是黑色,解决DialogFragment全屏时状态栏变黑
  15. 修改intellij IDEA 项目编码
  16. 《Python编程:从入门到实践》基础知识部分笔记和作业
  17. openEuler couldnt resolve host name
  18. html 用event.keycode控制只能输入小写字母,event.keyCode键码值表 附只能输入特定的字符串代码...
  19. # 2023 好用免费图床推荐
  20. 远程控制,我用MicroSoft 远程桌面连接

热门文章

  1. JNOJ 江南在线评测系统 搭建
  2. kettle工具坐mysql数据迁移_Kettle数据迁移的安装及使用
  3. vscode代码格式化、vetur代码格式化取消末尾添加逗号
  4. 编写一个简单的javaweb网上商城项目
  5. python怎么导入数据集keras_keras使用Sequence类调用大规模数据集进行训练的实现
  6. 计算机科学导论第五章计算机组成 学习笔记+习题答案
  7. web工程的读书笔记
  8. 将字符串中的大写字母转化为小写字母
  9. GameofMir引擎架设传奇服务器【2:登录器配置】
  10. bzoj 4765 普通计算姬