輸入首先在一行中給出兩個正整數 \(n\)和 \(m\),分別為命題個數和推理個數。這裡我們假設命題從 \(1\) 到 \(n\) 編號。
接下來 \(m\) 行,每行給出一對命題之間的推理關係,即兩個命題的編號 \(s1,s2\),表示可以從 \(s1\) 推出$ s2$。題目保證任意兩命題之間只存在最多一種推理關係,且任一命題不能迴圈自證(即從該命題出發推出該命題自己)。
最後一行給出待檢驗的兩個命題的編號 \(a,b\)。
在一行中首先輸出從 \(a\) 到 \(b\) 有多少種不同的推理路徑,然後輸出 \(yes\) 如果推理是「邏輯自洽」的,或 \(no\) 如果不是。
題目保證輸出資料不超過 \(10^9。\)
7 8
7 67 4
6 54 1
5 25 3
2 13 1
7 1
3 yes
7 8
7 67 4
6 54 1
5 25 3
6 13 1
7 1
3 no
這題正解有兩個,記憶化搜尋和拓撲排序。
我用的是拓撲排序。
統計有源有向無環簡單圖的路徑數,是拓撲排序的經典應用了。關鍵在於如何判斷是不是所有從起點出發的路徑都會匯集到終點。乙個簡單的方法就是看一下當終點出佇列時,看下佇列裡是否還有點,如果有,說明到這些點的路徑都不會經過終點。
#include#include#include#includeusing namespace std;
const int maxn=500;
const int maxm=maxn*maxn/2;
int n,m,tot,s,t;
int pre[maxm+8],now[maxn+8],son[maxm+8];
int deg[maxn+8],f[maxn+8],st[maxn+8];
int vis[maxn+8],r_deg[maxn+8];
int read()
void add(int u,int v)
void dfs(int x)
}int main()
s=read(),t=read();
dfs(s);
for (int i=1;i<=n;i++)
if (!vis[i])
for (int p=now[i];p;p=pre[p])
int head=1,tail=0;
st[++tail]=s;
f[s]=1;
bool flag=1;
while(head<=tail)
}} if (head<=tail) flag=0;
printf("%d ",f[t]);
flag?puts("yes"):puts("no");
return 0;
}
2023年天梯賽補題報告
l1 3調和平均 10分 這題用陣列會被扣一分,不用陣列就能做對,不知道為啥.include using namespace std intn double res 0 int main res 1.0 n res 1.0 res printf 2lf res l1 6 吃火鍋 15分 string...
2018天梯賽之旅
2018年3月31號,我有幸經歷了我人生中第一次天梯賽之旅,這一天我的心裡一邊為比賽而擔心著,一邊又為我這第一次的比賽之旅而激動著,其實實不相瞞,我的激動比不安要多一點,因為畢竟是第一次嘛,所以心裡難免會有一點兒小激動,還是可以理解的。好了,接下來跟大家說說我的比賽經歷吧。經過3個小時左右的時間,我...
2018天梯賽總結
2018年的天梯賽結束了,第一次參加天梯賽,作為乙個大二的學生,在鄭輕參加了華中賽區的比賽,成績還是不太好意思拿出來亮相的,只是得了八百出頭,還好隊伍裡有乙個大三的學姐撐著,勉強過了l1的800分線,還有我們幾個大二的同學,還有幾個大一的同學,大一的同學獲得的成績也很好,基本相差不大,最後因為想要過...