2020 12 28 2023年天梯賽L3 1

2022-05-27 19:42:10 字數 1504 閱讀 5583

輸入首先在一行中給出兩個正整數 \(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分線,還有我們幾個大二的同學,還有幾個大一的同學,大一的同學獲得的成績也很好,基本相差不大,最後因為想要過...