zoukankan      html  css  js  c++  java
  • 那就别担心了 (30分) PTA

    那就别担心了 (30 分)

    题目描述:

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

    输入格式

    输入首先在一行中给出两个正整数 N(1<N≤500)和 M,分别为命题个数和推理个数。这里我们假设命题从 1 到 N 编号。
    
    接下来 M 行,每行给出一对命题之间的推理关系,即两个命题的编号 S1 S2,表示可以从 S1 推出 S2。
    题目保证任意两命题之间只存在最多一种推理关系,且任一命题不能循环自证(即从该命题出发推出该命题自己)。 最后一行给出待检验的两个命题的编号 A B。

    输出格式

    在一行中首先输出从 A 到 B 有多少种不同的推理路径,然后输出 Yes 如果推理是“逻辑自洽”的,或 No 如果不是。
    
    题目保证输出数据不超过 10^9.
    

     

    示例:

    输入样例 17 8
    7 6
    7 4
    6 5
    4 1
    5 2
    5 3
    2 1
    3 1
    7 1
    输出样例 13 Yes
    
    输入样例 27 8
    7 6
    7 4
    6 5
    4 1
    5 2
    5 3
    6 1
    3 1
    7 1
    输出样例 23 No

    题目分析:

    看题目首先想到的是拓扑排序,但是实际上根拓扑排序没有很大的关系,

    题目使用邻接矩阵的方法存储图,使用dfs求解。

    但是使用dfs会导致最后一个测试点超时

    超时代码:

    #include<bits/stdc++.h>
    using namespace std;
    int a[500][500], ans = 0, num1, num5, num6, end1 = -1;
    bool ans2 = true;
    void func(int flag1, int flag2)
    {
        if (flag1 == num6)
        {
            ans++;
            return;
        }
        int k;
        for (k = 0;a[flag1][k] != -1;k++)
        {
            func(a[flag1][k], 0);
        }
        if (k == 0)
            ans2 = false;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        memset(a, -1, sizeof(a));
        int  num2, num3, num4;
        cin >> num1 >> num2;
        for (int k = 0;k < num2;k++)
        {
            cin >> num3 >> num4;
            for (int k = 0;;k++)//建立邻接矩阵
            {
                if (a[num3][k] == -1)
                {
                    a[num3][k] = num4;
                    break;
                }
            }
        }
        cin >> num5 >> num6;
        func(num5, 0);
        cout << ans << (ans2 ? " Yes" : " No");
        return 0;
    }

    故需对dfs进行记忆搜索优化。。

    代码

    C++:

    #include<bits/stdc++.h>
    using namespace std;
    int a[500][500], num1, num5, num6;
    int weight[500];
    bool ans2 = true;
    int func(int flag1)
    {
        if (weight[flag1] != -1)
            return weight[flag1];
        if (flag1 == num6)
            return weight[flag1] = 1;
        int k, res = 0;
        for (k = 0;a[flag1][k] != -1;k++)
        {
            if (weight[a[flag1][k]] == -1)
                func(a[flag1][k]);
            res += weight[a[flag1][k]];
        }
        if (k == 0)
            ans2 = false;
        return weight[flag1] = res;
    }
    int main()
    {
        ios::sync_with_stdio(false);
        memset(a, -1, sizeof(a));
        memset(weight, -1, sizeof(weight));
        int  num2, num3, num4;
        cin >> num1 >> num2;
        for (int k = 0;k < num2;k++)
        {
            cin >> num3 >> num4;
            for (int k = 0;;k++)//建立邻接矩阵
            {
                if (a[num3][k] == -1)
                {
                    a[num3][k] = num4;
                    break;
                }
            }
        }
        cin >> num5 >> num6;
        cout << func(num5);
        cout << (ans2 ? " Yes" : " No");
        return 0;
    }
  • 相关阅读:
    无题
    使用git clone 出现 Permission denied 解决办法
    为什么要用BigDecimal
    FastJson对于JSON格式字符串、JSON对象及JavaBean之间的相互转换
    版本管理规范
    Intellij Idea 常用快捷键
    AI学习资源
    Python图谱
    网站架构演化历程
    微服务系列
  • 原文地址:https://www.cnblogs.com/zjw1324399/p/14413690.html
Copyright © 2011-2022 走看看