一條單向的鐵路線上,依次有編號為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 ...