輸入格式:
輸入首先在一行中給出兩個正整數 n(1接下來 m 行,每行給出一對命題之間的推理關係,即兩個命題的編號 s1 s2,表示可以從 s1 推出 s2。題目保證任意兩命題之間只存在最多一種推理關係,且任一命題不能迴圈自證(即從該命題出發推出該命題自己)。
最後一行給出待檢驗的兩個命題的編號 a b。
輸出格式:
在一行中首先輸出從 a 到 b 有多少種不同的推理路徑,然後輸出 yes 如果推理是「邏輯自洽」的,或 no 如果不是。
題目保證輸出資料不超過 109
10^9
109輸入樣例 1:
7 87 6
7 46 5
4 15 2
5 32 1
3 17 1
輸出樣例 1:
3 yes
輸入樣例 2:
7 87 6
7 46 5
4 15 2
5 36 1
3 17 1
輸出樣例 2:
3 no
第一種思路肯定是dfs,但是最後乙個測試點會超時
#include
#define ios ios::sync_with_stdio(false);cin.tie(0);
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn =
505;
int s, t, count =0;
vector<
int> v[maxn]
;set<
int> ss;
void
dfs(
int x)
}int
main()
cin >> s >> t;
dfs(s)
; cout <<
::count <<
' ';if(
!ss.
size()
) cout <<
"yes"
;else
cout <<
"no"
;return0;
}
第二種思路記憶化搜尋(dfs+dp)
起初用 p[x] 儲存從 s 到 x 的路徑數,用stack記憶體會超限;反向存圖不好判斷是否「邏輯自洽」;
於是改用 p[x] 儲存從 x 到 t 的路徑數,遞迴呼叫即可;
#include
#define ios ios::sync_with_stdio(false);cin.tie(0);
using
namespace std;
typedef
long
long ll;
typedef
unsigned
long
long ull;
const
int maxn =
505;
int p[maxn]
;int s, t;
bool judge =1;
vector<
int> v[maxn]
;int
dfs(
int x)
intmain()
cin >> s >> t;
p[t]=1
;dfs
(s);
cout << p[s]
<<
' '<<
(judge ==1?
"yes"
:"no");
return0;
}
PTA L3 025 那就別擔心了 30分
博主將這種邏輯推演稱為 邏輯自洽 即從某個命題出發的所有推理路徑都會將結論引導到同乙個最終命題 開玩笑的,千萬別以為這是真正的邏輯自洽的定義 現給定乙個更為複雜的邏輯推理圖,本題就請你檢查從乙個給定命題到另乙個命題的推理是否是 邏輯自洽 的,以及存在多少種不同的推理路徑。例如上圖,從 你遇到難題了嗎...
python初級 302 5 列表
1 def關鍵字 2 函式名及後面跟隨的括號 3 冒號加上函式體 函式名及後面跟隨的括號 3 帶乙個,二個,三個引數的函式及呼叫 family mom dad baby nums 1,2,3,4 列表 一堆資料存在一起,放在某種組或者集合中 存放示意圖 陰影部分的叫做索引 下面的內容為元素 注意 必...
NEEPU OJ 3025 集合之和
描述給定乙個集合s 集合元素數量 30 求出此集合所有子集元素之和。輸入集合中的元素 元素 1000 輸出乙個正整數表示元素之和。輸入樣例 1 2 3 輸出樣例 1 提示樣例解釋 子集為 元素之和為 2 3 2 3 10 思路這道題是一道找規律題,假設有n個元素 每次固定第乙個元素,組合剩下的元素 ...