那就别担心了(DFS优化)30行代码简单易懂

news2024/11/15 18:13:37

下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题,其实都不用担心。

博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 3 条不同的推理路径。

输入格式:

输入首先在一行中给出两个正整数 N(1<N≤500)和 M,分别为命题个数和推理个数。这里我们假设命题从 1 到 N 编号。

接下来 M 行,每行给出一对命题之间的推理关系,即两个命题的编号 S1 S2,表示可以从 S1 推出 S2。题目保证任意两命题之间只存在最多一种推理关系,且任一命题不能循环自证(即从该命题出发推出该命题自己)。

最后一行给出待检验的两个命题的编号 A B

输出格式:

在一行中首先输出从 A 到 B 有多少种不同的推理路径,然后输出 Yes 如果推理是“逻辑自洽”的,或 No 如果不是。

题目保证输出数据不超过 109。

输入样例 1:

7 8
7 6
7 4
6 5
4 1
5 2
5 3
2 1
3 1
7 1

输出样例 1:

3 Yes

输入样例 2:

7 8
7 6
7 4
6 5
4 1
5 2
5 3
6 1
3 1
7 1

输出样例 2:

3 No

代码长度限制

16 KB

时间限制

400 ms

内存限制

 DFS

30行代码(运行超时23分)最后一个过不了

#include<bits/stdc++.h>
using namespace std;
const int maxn = 500 + 10;
int N, M, K, A, B, D, NUM;
vector<vector<int>>v(maxn);
bool ok = true;
int DFS(int start, int enl)
{
    if (start == enl) return NUM++;
    for (auto i : v[start])
    {
        if(v[i].size() == 0 && i != enl)ok = false;
        DFS(i, enl);   
    }
}

int main()
{
    cin >> N >> M;//N个命题M个推理
    while (M--)
    {
        cin >> A >> B;
        v[A].emplace_back(B);
    }
    cin >> K >> D;
    DFS(K, D);
    if(!NUM)ok = false;
    ok ? cout << NUM << ' ' << "Yes" : cout << NUM << ' ' << "No";
    return 0;
}

画一个图分析一下

如果多连几条线例如:6->5   6->2 ………… 以及当N == 500时,每一条线都连接499个点,直接暴搜会出现一个点重复被访问了多次的情况确实浪费时间,优化也从这方面下手

根据样例:反过来看到1的点无非2 3 4那么可以认为2和3,4到1的路径有1条

5可以到2 3,对于5而言因为我们已知2和3只有1条路径可以到1,所以5到1的路径就应该是Road[2]+Road[3] = 2,递推得Road[7] = Road[4] + Road[6] = Road[4] + Road[5] = 3

因此我们不妨引入一个数组Road记录各点出发到达终点有多少条路径,当我们重复访问到已被记录的点时就省去了再跑一遍的时间,直接反馈答案。

AC代码如下(18ms)

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
const int maxn = 500 + 10;
int N, M, K, A, B, D, NUM, Road[maxn];
vector<vector<int>>v(maxn);
bool ok = true;
int DFS(int start, int enl)
{
    if (start == enl)return 1;
    if (Road[start])return Road[start];
    for (auto i : v[start])
    {
        if (v[i].size() == 0 && i != enl)ok = false;
        Road[start] += DFS(i, enl);
    }
    return Road[start];
}

int main()
{
    IOS cin >> N >> M;//N个命题M个推理
    while (M--)
    {
        cin >> A >> B;
        v[A].emplace_back(B);
    }
    cin >> K >> D;
    DFS(K, D);
    if (!Road[K])ok = false;
    ok ? cout << Road[K] << ' ' << "Yes" : cout << Road[K] << ' ' << "No";
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最简单的 goland package 教程包括自定义包的使用

一、Hello World项目 一切从最简单开始&#xff1a; mkdir myappcd myappgo mod init myapp // myapp是主项目名 这行命令将生成一个go.mod文件&#xff0c;这个文件会记录所有的包的依赖关系&#xff0c;一个空的go.mod只有项目名称和go版本号. nano main.go : package mai…

VMware虚拟机三种网络模式详解之NAT(地址转换模式)

VMware虚拟机三种网络模式详解 NAT&#xff08;地址转换模式&#xff09; 二、NAT&#xff08;地址转换模式&#xff09; 刚刚我们说到&#xff0c;如果你的网络ip资源紧缺&#xff0c;但是你又希望你的虚拟机能够联网&#xff0c;这时候NAT模式是最好的选择。NAT模式借助虚拟…

[组合数学]母函数与递推关系

文章目录 母函数---解决计数组合 球相同 盒子不同 不能是空 C n − 1 m − 1 \quad C_{n-1}^{m-1} Cn−1m−1​数的拆分 递推关系常系数线性齐次递推关系常系数线性非齐次递推关系汉诺塔递推关系 母函数—解决计数 普母函数—组合问题 指母函数—排列问题 f(x) ∑ i 1 n a i…

阿里云服务器开放端口的正确方式(超详细新版教程)

阿里云服务器端口怎么打开&#xff1f;云服务器ECS端口在安全组中开启&#xff0c;轻量应用服务器端口在防火墙中打开&#xff0c;阿里云服务器网以80端口为例&#xff0c;来详细说下阿里云服务器端口开放图文教程&#xff0c;其他的端口如8080、3306、443、1433也是同样的方法…

VMware虚拟机三种网络模式详解之Host-Only(仅主机模式)

VMware虚拟机三种网络模式详解 Host-Only&#xff08;仅主机模式&#xff09; 三、Host-Only&#xff08;仅主机模式&#xff09; Host-Only模式其实就是NAT模式去除了虚拟NAT设备&#xff0c;然后使用VMware Network Adapter VMnet1虚拟网卡连接VMnet1虚拟交换机来与虚拟机…

CAR-T细胞疗法在实体瘤研究中的挑战和新进展

什么是CAR-T? CAR-T是Chimeric Antigen Receptor T-cell&#xff08;嵌合抗原受体T细胞&#xff09;的缩写。它是通过将人体自身的T细胞进行基因改造&#xff0c;使其具有针对肿瘤细胞的抗原特异性&#xff0c;从而增强免疫系统对肿瘤细胞的攻击能力。CAR-T治疗的过程&#xf…

OJ练习第107题——二叉搜索子树的最大键值和

二叉搜索子树的最大键值和 力扣链接&#xff1a;1373. 二叉搜索子树的最大键值和 题目描述 给你一棵以 root 为根的 二叉树 &#xff0c;请你返回 任意 二叉搜索子树的最大键值和。 二叉搜索树的定义如下&#xff1a; 任意节点的左子树中的键值都 小于 此节点的键值。 任意…

SpringBoot——IOC与AOP

文章目录 IOC AOP一、 分层解耦1.1 IOC - 控制反转 详细1.2 DI - 依赖注入 详解 二、AOP2.1 了解2.2 快速入门 - AOP 开发步骤2.2.1 Maven依赖2.2.2 代码实现2.2.3 AOP 应用场景及优势 2.3 核心概念2.3.1 连接点 - JoinPoint2.3.2 AOP执行流程 2.4 通知2.4.1 通知类型2.4.2 通知…

百度贴吧视频发布软件视频教程(操作十分简单)

百度贴吧视频发布软件视频教程(操作十分简单) 软件有月卡、季卡、半年卡、年卡 【有时软件个别卡种售空&#xff0c;价格有上涨下降&#xff0c;关注获取当日价格】 我现在正在发帖的一个实时的一个画面&#xff0c;就是有很多同学问我就是喜羊羊今天还好跑吗&#xff0c;明天…

linux入门---通信的理解和匿名管道

这里写目录标题 为什么有通信通信的两个标准通信的本质管道通信的本质如何实现管道通信管道文件的特点管道的特征如何理解指令上的管道 为什么有通信 在我们的生活中有很多地方都需要用到通信&#xff0c;比如说出去玩要告诉伙伴们我们到哪了&#xff0c;做一件事的时候得通过…

MySQL基础(三十七)主从复制

1. 主从复制概述 1.1 如何提升数据库并发能力 此外&#xff0c;一般应用对数据库而言都是“ 读多写少 ”&#xff0c;也就说对数据库读取数据的压力比较大&#xff0c;有一个思路就是采用数据库集群的方案&#xff0c;做 主从架构 、进行 读写分离 &#xff0c;这样同样可以提…

第四十六天学习记录:C语言进阶:KMP算法个人学习方法

学习了strstr库函数后&#xff0c;老师让了解KMP算法&#xff0c;这也算是我接触到的第一个算法。 由于这一块得自己翻资料自学&#xff0c;因此初识比较吃力。 后面根据自己的理解方式&#xff0c;个人认为理解KMP算法最关键点就是理解next数组是怎么生成的。 下面说说我理解n…

对于西瓜书神经网络的c#手写版本

本文根据西瓜书第五章中给出的公式编写&#xff0c;书中给出了全连接神经网络的实现逻辑&#xff0c;本文在此基础上编写了Mnist10手写10个数字的案例&#xff0c;网上也有一些其他手写的例子参考。demo使用unity进行编写&#xff0c;方便且易于查错。 该案例仅作为学习&#x…

CSS零基础快速入门(详细教程)

1&#xff0c;CSS概述 CSS是层叠样式表&#xff0c;由Cascading Style Sheets简称而来。 CSS的功能为&#xff1a;能够对网页中元素位置的排版进行像素级精确控制&#xff0c;实现美化页面的效果&#xff0c;并且能够做到页面的样式和结构分离。 CSS的作用效果跟我们日常使用…

这个 快速排序详解过程 我能吹一辈子!

文章目录 快速排序概念快速排序递归实现Hoare版本挖坑法前后指针法 快速排序非递归实现Hoare版本挖坑法前后指针法 快速排序的俩个优化三数取中小区间优化 快速排序概念 快速排序是公认的排序之王&#xff0c;快速排序是Hoare于1962年提出的一种二叉树结构的交换排序算法&#…

【Linux】静态库与动态库

前言 对于C/C的学习者&#xff0c;我们经常听到C/C的标准库&#xff0c;我们也经常使用它们&#xff0c;但是我们在使用的时候经常只包含一下头文件&#xff0c;然后就使用了&#xff0c;我们从来没有认真的研究过C/C的标准库&#xff0c;而且C/C的头文件中只有声明并没有声明的…

文件上传,解析漏洞编译器安全(23)文件上传为什么加空格和修改为其他符号(例如换行符)问题

apache低版本解析漏洞 这个网站目录里有两个文件&#xff0c;一个是正常的php文件&#xff0c;另一个xx.php.xxx&#xff0c;源码是php源码&#xff0c;命名的文件&#xff0c;而访问中xxx的文件依旧可以执行出php代码的结果&#xff0c;而xxx就能当php文件解析&#xff0c;这…

uvc摄像头驱动uvc设备的注册分析

uvc摄像头驱动uvc设备的注册分析 文章目录 uvc摄像头驱动uvc设备的注册分析uvc_inituvc_probeuvc_register_videouvc_register_chainsuvc_register_termsuvc_register_video uvc_ioctl_opsuvc_fops uvc_init /driver/media/usb/uvc/uvc_driver.c /** UVC 驱动结构体*/ struct…

每日学术速递5.19

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.On the Hidden Mystery of OCR in Large Multimodal Models 标题&#xff1a;论大型多模态模型中 OCR 的隐藏奥秘 作者&#xff1a;Yuliang Liu, Zhang Li, Hongliang Li, Wenwen…

计算机图形学-GAMES101-11

显式几何的表示方法 Point Cloud 使用一系列点表示物体的表面。理论上可以表达空间中任何物体。如物体扫描会得到空间中一系列点&#xff0c;但在建模时我们要提取出大量多边形的面。点云对密度要求很高&#xff0c;因此不常使用。 Polygon Mesh 使用三角形表示物体。涉及三…