【第二十四题】逻辑闭环(北理工/北京理工大学/程序设计方法与实践/小学期 )
目录
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又多了很多细节:
- 逻辑闭环不需要记录首尾,只要前几个中有可以构成闭环的数字即可
- 既然是闭环,那么任何数都可以当做开头,所以你从A搜到B可以,也可以从B搜到A
- 我们怎么确定哪一个在闭环里?难道是建立一个数组储存前几个读入的,然后每读入一个数,就对整个数组中每一个数都bfs一次?太累了,绝对TLE。不妨优化一下:假设前n-1个数不能形成闭环,而有了第n对数就形成闭环,说明第n对数必然在闭环内,这样每次读入一个新的数就bfs一次即可。
- 照着这个思想,我第一次TLE掉4个hhh,如果算法没有什么问题,或者说同样的算法别人能过你就不能过 ,那必然是你多了很多冗杂的步骤,之后就开始分析。
- 此题不要求最短步数,所以其实只要能形成逻辑闭环即可,不需要用vis数组计步,用vis数组的话需要判断,memset,都是浪费时间。
- 具体思路框架在代码里找吧
代码
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;
}
【第二十四题】逻辑闭环(北理工/北京理工大学/程序设计方法与实践/小学期 )相关推荐
- 【第十四题】水晶球|贪心(北理工/北京理工大学/程序设计方法与实践/小学期 )
目录 Description 思路: 几个点: 代码: Description 直接c v过来的,有很多符号,懒得改了,仅为搜索引擎而放进来) 和许多同龄女孩子一样,久莲也喜欢水晶球. 还有 10 ...
- 【第十九题】填坑II(北理工/北京理工大学/程序设计方法与实践/小学期 )
Description emmm,还是北湖深坑,不用惊喜,不用意外 我们继续用石头填! 北湖的地面依旧是一维的,每一块宽度都为1,高度是非负整数,用一个数组来表示. 还是提供不限量的 1 乘號 ...
- 【第二十三题】带旋转的数独游戏|dfs(北理工/北京理工大学/程序设计方法与实践/小学期 )
目录 前言 dfs学习 思路 代码修正 源代码 我修正后的代码 前言 说实话这题我弄的也不是很明白,而csdn上只有一份代码@loveumozart,还没多少注释,关键还有很多冗余代码,于是我就做 ...
- 华科计算机考研和北理工,北京理工大学和华中科技大学比较起来,该报哪一所?...
第一.如果从地理位置来看,建议选择北京理工大学 北京和上海是学子们最想去的两个城市,不论是读书还是上班,都是非常好的一个选择.武汉相比来说,这个城市的水平低一个档次. 第二.如果想升学,建议选择北京理 ...
- 第二十四题——[ZJCTF 2019]NiZhuanSiWei
题目地址:https://buuoj.cn/challenges 解题思路 第一步:进入题目,展示了php代码 第二步:使用data协议绕过text参数检测 经过代码分析,text参数不能为空,且根据 ...
- 经典算法题每日演练——第二十四题 梳排序
这篇再看看一个经典的排序,梳排序,为什么取名为梳,可能每个梳都有自己的gap吧,大梳子gap大一点,小梳子gap小一点. 上一篇我们看到鸡尾酒排序是在冒泡排序上做了一些优化,将单向的比较变成了双向,同 ...
- 大学计算机实验五北理工,北京理工大学计算机实验五报告表
实验五实验报告表 实验名称: 学号:姓名:班级:实验时间: 实验报告表5–1进程同步实验观察结果记录表 进程1 操作步数进程1状态转换情况记录 1进程1申请资源A1个 2操作系统返回进程1资源A1个 ...
- 第四章第二十六题(金融应用:货币单位)(Financial application: monetary units)
第四章第二十六题(金融应用:货币单位)(Financial application: monetary units) *4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为i ...
- 第十四题: 以下代码的输出结果是?
第十四题: 以下代码的输出结果是? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class B { public static B t1 = n ...
最新文章
- 步步为营 .NET 设计模式学习笔记 十四、Decorator(装饰模式)
- 报道称:Check Point正在洽谈收购CyberArk
- 配置深度学习环境的重要资料
- 怎样在vue单页面中引入其他组件
- Gradle build设置自动log开关
- “10亿赌约”董明珠赢了!格力电器2018年总收入超2000亿
- 谁是真凶?《CSI:犯罪现场调查》正帮助AI提高断案能力
- ehcache 手动刷新缓存_清空DNS缓存的两个小方法
- GID绘图和CDC类
- “21天好习惯”第一期-13
- HTTP协议响应头之Transfer-Encoding:分块传输详解
- 外省市机动车驾驶证换领本市机动车驾驶证
- 人工智能 机器学习 数据挖掘 数据分析 算法大全
- android全屏状态栏是黑色,解决DialogFragment全屏时状态栏变黑
- 修改intellij IDEA 项目编码
- 《Python编程:从入门到实践》基础知识部分笔记和作业
- openEuler couldnt resolve host name
- html 用event.keycode控制只能输入小写字母,event.keyCode键码值表 附只能输入特定的字符串代码...
- # 2023 好用免费图床推荐
- 远程控制,我用MicroSoft 远程桌面连接