洛谷 P1983 車站分級(拓撲排序)

2021-09-25 11:59:23 字數 1537 閱讀 3050

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

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

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

輸入格式:

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

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

輸出格式:

乙個正整數,即 n 個火車站最少劃分的級別數。

輸入樣例#1:複製

9 2 

4 1 3 5 6

3 3 5 6

輸出樣例#1:複製

2
輸入樣例#2:複製

9 3 

4 1 3 5 6

3 3 5 6

3 1 5 9

輸出樣例#2:複製

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

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

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

說明所有沒有停靠的站都小於任何乙個停靠的站,所以把這些站之間兩兩建邊,拓撲排序看最多有幾層,

需要注意的是建邊時時間可能會超限,注意重邊和預處理停靠的站和未停靠的站。

#include #include #include #include #define n 1020

using namespace std;

int n, m;

int indegree[n], a[n], b[n], books[n][n];

vectore[n];

struct edge ;

queueq;

int bfs()

); while (!q.empty())

); }

} return ans;

}int main()

b[len++] = j;

} for (i = 0; i < k; i++)

} }printf("%d\n", bfs());

return 0;

}

洛谷 P1983 車站分級(拓撲排序)

思路 對於每一趟車,將其經過的車站中,停靠的和不停靠的連一條邊,注意邊的去重,要雙向標記,不然有個點會超時,這樣拓撲排序遞推一下就能分級出來 include using namespace std struct node const int n 1005 int n,m int ru n vecto...

洛谷P1983 車站分級 拓撲排序

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

洛谷 P1983 車站分級 拓撲排序

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