車站分級(拓撲排序)

2022-03-14 11:54:04 字數 1548 閱讀 5470

2023年noip全國聯賽普及組

題目描述:

一條單向的鐵路線上,依次有編號為1, 2, …, n的n個火車站。每個火車站都有乙個級別,最低為1級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求:如果這趟車次停靠了火車站x,則始發站、終點站之間所有級別大於等於火車站x的都必須停靠。(注意:起始站和終點站自然也算作事先已知需要停靠的站點)

例如,下表是5趟車次的運**況。其中,前4趟車次均滿足要求,而第5趟車次由於停靠了3號火車站(2級)卻未停靠途經的6號火車站(亦為2級)而不滿足要求。

現有m趟車次的運**況(全部滿足要求),試推算這n個火車站至少分為幾個不同的級別。

輸入描述:

第一行包含2個正整數n, m,用乙個空格隔開。

第i+1行(1≤i≤m)中,首先是乙個正整數s_i(2≤s_i≤n),表示第i趟車次有s_i個停靠站;接下來有s_i個正整數,表示所有停靠站的編號,從小到大排列。每兩個數之間用乙個空格隔開。輸入保證所有的車次都滿足要求。

輸出描述:

輸出只有一行,包含乙個正整數,即n個火車站最少劃分的級別數。

樣例輸入:

[sample 1]

9 2

4 1 3 5 6

3 3 5 6

[sample 2]

9 3

4 1 3 5 6

3 3 5 6

3 1 5 9

樣例輸出:

對於20%的資料,1 ≤ n, m ≤ 10;

對於50%的資料,1 ≤ n, m ≤ 100;

對於100%的資料,1 ≤ n, m ≤ 1000。

思路:

從停車的點向未停車的點連一條單向邊,注意判重,最後拓撲排序,統計有幾層。

#include

#include

#include

using namespace std;

const int maxn=1010;

int n,m,k,e[maxn][maxn],tmp[maxn],a[maxn];

int ans,in[maxn],q[maxn],merge[maxn];

bool flag[maxn];

int init()

while(c>='0'&&c<='9')

return p*f;

}int main()

for(int j=tmp[1];jif(!a[j])

for(int i=1;i<=k;i++)

if(!e[j][tmp[i]])}}

while(1)

if(!top) break;

for(int i=1;i<=top;i++)

for(int j=1;j<=n;j++)

if(e[q[i]][j])

ans++;

}cout0;}

拓撲排序 車站分級

一條單向的鐵路線上,依次有編號為1,2,n 的n個火車站。每個火車站都有乙個級別,最低為1級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求 如果這趟車次停靠了火車站x,則始發站 終點站之間所有級別大於等於火車站x的都必須停靠。注意 起始站和終點站自然也算作事先已知需要停靠的站點 例如,下表是...

P1983 車站分級(拓撲排序)

一條單向的鐵路線上,依次有編號為 1,2,n 的 n 個火車站。每個火車站都有乙個級別,最低為 1 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求 如果這趟車次停靠了火車站 x,則始發站 終點站之間所有級別大於等於火車站 x 的都必須停靠。注意 起始站和終點站自然也算作事先已知需要停靠的站...

P1983 車站分級(拓撲排序)

題目傳送門 這題就是用拓撲排序分層 首先是建圖 每進行一次輸入,就將沒有停靠的站與停靠的站都建立一條邊 因為題目樣例不怎麼大,所以可以用鄰接矩陣 for int i 1 i m i 輸入 for int j a 1 j a x j 建圖 if c j 0 不是停靠站 for int k 1 k x ...