ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

那就别担心了(DFS)

2022-06-10 21:01:06  阅读:149  来源: 互联网

标签:自洽 cur int 命题 担心 DFS 505 推理


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

ziqia.jpg

博主将这种逻辑推演称为“逻辑自洽”,即从某个命题出发的所有推理路径都会将结论引导到同一个最终命题(开玩笑的,千万别以为这是真正的逻辑自洽的定义……)。现给定一个更为复杂的逻辑推理图,本题就请你检查从一个给定命题到另一个命题的推理是否是“逻辑自洽”的,以及存在多少种不同的推理路径。例如上图,从“你遇到难题了吗?”到“那就别担心了”就是一种“逻辑自洽”的推理,一共有 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 内存限制 64 MB   一开始用DFS,T了:
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 
 5 int num;
 6 int mp[505][505], maybe[505][505], vis[505];
 7 
 8 void dfs(int cur, int d, int n)
 9 {
10     if(cur==d) num++;
11     if(maybe[cur][d]==0) return;
12     int i;
13     for(i=1;i<=n;i++)
14     {
15         if(vis[i]==0&&mp[cur][i])
16         {
17             vis[i] = 1;
18             dfs(i, d, n);
19             vis[i] = 0;
20         }
21     }
22 }
23 
24 int main()
25 {
26     int n, m, s, d, u, v, i;
27     scanf("%d %d", &n, &m);
28     while(m--)
29     {
30         scanf("%d %d", &u, &v);
31         mp[u][v] = 1;
32         maybe[u][v] = 1;
33     }
34     scanf("%d %d", &s, &d);
35     ///确定每个点是否有可能到达终点
36     for(i=1; i<=n; i++)
37     {
38         for(u=1; u<=n; u++)
39         {
40             for(v=1; v<=n; v++)
41             {
42                 if(maybe[u][i]&&maybe[i][v])
43                     maybe[u][v] = 1;
44             }
45         }
46     }
47     num = 0;
48     memset(vis, 0, sizeof(vis));
49     vis[s] = 1;
50     dfs(s, d, n);
51     printf("%d ", num);
52     for(i=1;i<n;i++)
53     {
54         if(i==s||i==d) continue;
55         else if(maybe[s][i]&&!maybe[i][d]&&!maybe[d][i]) break;
56     }
57     if(i<n||num==0) printf("No\n");
58     else printf("Yes\n");
59     return 0;
60 }

AC代码:

 1 #include <stdio.h>
 2 
 3 int mp[505][505], num[505], vis[505];
 4 
 5 int dfs(int cur, int n)
 6 {
 7     vis[cur] = 1;
 8     if(num[cur]) return num[cur];
 9     else
10     {
11         int i;
12         for(i=1;i<=n;i++)
13         {
14             if(mp[cur][i]) num[cur] += dfs(i, n);
15         }
16         return num[cur];
17     }
18 }
19 
20 int main()
21 {
22     int n, m, u, v, s, d, i;
23     scanf("%d %d", &n, &m);
24     while(m--)
25     {
26         scanf("%d %d", &u, &v);
27         mp[u][v] = 1;
28     }
29     scanf("%d %d", &s, &d);
30     num[d] = 1;
31     num[s] = dfs(s, n);
32     printf("%d ", num[s]);
33     for(i=1;i<=n;i++)
34     {
35         if(vis[i]&&!num[i]) break;
36     }
37     if(i<=n) printf("No\n");
38     else printf("Yes\n");
39     return 0;
40 }

 

标签:自洽,cur,int,命题,担心,DFS,505,推理
来源: https://www.cnblogs.com/0xiaoyu/p/16364664.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有