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 ...