博主將這種邏輯推演稱為「邏輯自洽」,即從某個命題出發的所有推理路徑都會將結論引導到同乙個最終命題(開玩笑的,千萬別以為這是真正的邏輯自洽的定義……)。
現給定乙個更為複雜的邏輯推理圖,本題就請你檢查從乙個給定命題到另乙個命題的推理是否是「邏輯自洽」的,以及存在多少種不同的推理路徑。
例如上圖,從「你遇到難題了嗎?」到「那就別擔心了」就是一種「邏輯自洽」的推理,一共有 3 條不同的推理路徑。
輸入首先在一行中給出兩個正整數 n(1500)和 m,分別為命題個數和推理個數。這裡我們假設命題從 1
到 n 編號。
接下來 m 行,每行給出一對命題之間的推理關係,即兩個命題的編號 s1 s2,表示可以從 s1 推出 s2。
題目保證任意兩命題之間只存在最多一種推理關係,且任一命題不能迴圈自證(即從該命題出發推出該命題自己)。
最後一行給出待檢驗的兩個命題的編號 a b。
在一行中首先輸出從 a 到 b 有多少種不同的推理路徑,然後輸出 yes 如果推理是「邏輯自洽」的,或 no 如果不是。題目保證輸出資料不超過
10^9.
輸入樣例 1:7看題目首先想到的是拓撲排序,但是實際上根拓撲排序沒有很大的關係,8767
4654
1525
3213
171輸出樣例 1:
3yes
輸入樣例 2:
7876
7465
4152
5361
3171
輸出樣例 2:
3 no
題目使用鄰接矩陣的方法儲存圖,使用dfs求解。
但是使用dfs會導致最後乙個測試點超時
超時**:
#includeusing故需對dfs進行記憶搜尋優化。。namespace
std;
int a[500][500], ans = 0, num1, num5, num6, end1 = -1
;bool ans2 = true
;void func(int flag1, int
flag2)
intk;
for (k = 0;a[flag1][k] != -1;k++)
if (k == 0
) ans2 = false;}
intmain()}}
cin >> num5 >>num6;
func(num5, 0);
cout
<< ans << (ans2 ? "
yes" : "no"
);
return0;
}
c++:
#includeusingnamespace
std;
int a[500][500], num1, num5, num6;
int weight[500
];bool ans2 = true
;int func(int
flag1)
if (k == 0
) ans2 = false
;
return weight[flag1] =res;
}int
main()}}
cin >> num5 >>num6;
cout
<
cout
<< (ans2 ? "
yes" : "no"
);
return0;
}
L3 1 那就別擔心了 30分
博主將這種邏輯推演稱為 邏輯自洽 即從某個命題出發的所有推理路徑都會將結論引導到同乙個最終命題 開玩笑的,千萬別以為這是真正的邏輯自洽的定義 現給定乙個更為複雜的邏輯推理圖,本題就請你檢查從乙個給定命題到另乙個命題的推理是否是 邏輯自洽 的,以及存在多少種不同的推理路徑。例如上圖,從 你遇到難題了嗎...
PTA L3 025 那就別擔心了 30分
博主將這種邏輯推演稱為 邏輯自洽 即從某個命題出發的所有推理路徑都會將結論引導到同乙個最終命題 開玩笑的,千萬別以為這是真正的邏輯自洽的定義 現給定乙個更為複雜的邏輯推理圖,本題就請你檢查從乙個給定命題到另乙個命題的推理是否是 邏輯自洽 的,以及存在多少種不同的推理路徑。例如上圖,從 你遇到難題了嗎...
pta L3 025 那就別擔心了 30 分
輸入格式 輸入首先在一行中給出兩個正整數 n 1接下來 m 行,每行給出一對命題之間的推理關係,即兩個命題的編號 s1 s2,表示可以從 s1 推出 s2。題目保證任意兩命題之間只存在最多一種推理關係,且任一命題不能迴圈自證 即從該命題出發推出該命題自己 最後一行給出待檢驗的兩個命題的編號 a b。...