拓撲排序 車站分級

2021-10-05 14:01:43 字數 1608 閱讀 4875

一條單向的鐵路線上,依次有編號為1, 2, …, n 的n個火車站。

每個火車站都有乙個級別,最低為1級。

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

例如,下表是5趟車次的運**況。

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

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

輸入格式

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

第 i + 1 行(1 ≤ i ≤ m)中,首先是乙個正整數 sisi(2 ≤ si ≤ n),表示第 i 趟車次有 sisi 個停靠站;接下來有sisi個正整數,表示所有停靠站的編號,從小到大排列。

每兩個數之間用乙個空格隔開。輸入保證所有的車次都滿足要求。

輸出格式

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

資料範圍

1≤n,m≤10001≤n,m≤1000

輸入樣例:

9 34 1 3 5 6

3 3 5 6

3 1 5 9

輸出樣例:

3

#include

#include

#include

#include

using

namespace std;

const

int n =

2010

, m =

1000010

;int n, m;

int h[n]

, e[m]

, w[m]

, ne[m]

, idx;

int q[n]

, d[n]

;int dist[n]

;bool st[n]

;void

add(

int a,

int b,

int c)

void

topsort()

}}intmain()

int ver = n + i;

for(

int j = start; j <= end; j ++)if

(!st[j]

)add

(j, ver,0)

;else

add(ver, j,1)

;}topsort()

;for

(int i =

1; i <= n; i ++

) dist[i]=1

;for

(int i =

0; i < m + n; i ++

)int res =0;

for(

int i =

1; i <= n ; i ++

) res =

max(res, dist[i]);

cout << res << endl;

return0;

}

車站分級(拓撲排序)

2013年noip全國聯賽普及組 題目描述 一條單向的鐵路線上,依次有編號為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 ...