一條單向的鐵路線上,依次有編號為
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 個火車站最少劃分的級別數。
9 2
4 1 3 5 6
3 3 5 6
9 3
4 1 3 5 6
3 3 5 6
3 1 5 92
3【資料範圍】
對於 20%
的資料,
1 ≤ n,
m ≤ 10;
對於 50%
的資料,
1 ≤ n,
m ≤ 100;
對於 100%
的資料,
1 ≤ n,
m ≤ 1000。
一道noip的題,也是一道經典的拓撲排序。
題意:有n個火車站,有m趟車,第i趟車有si個停靠站從小到大排列。
如果這趟車 次停靠了火車站x,
則始發站、終點站之間所有級別大於等於火車站
x 的都必須停靠
。(注 意:起始站和終點站自然也算作事先已知需要停靠的站點),問這n個火車站至少分為幾個不同的級別。
解法:紅字中可以很明顯地想到拓撲排序,將停靠的和不停靠的火車站建邊,再做拓撲排序,層數即為至少要分的級別數。
此題用層次寬搜更加清晰,而且統計入度為0的點的過程在修改的時候統計。
#include #include #include #include #include using namespace std;
int t,len,p1,p2,p3,ans;
int a[10000],b[10000],mat[1005][1005],ind[10000],q[1000000];
bool flag[10000];
int main()
len=0;
for(int j=a[1];j<=a[t];j++)
if(!flag[j]) b[++len]=j;
else flag[j]=false;
for(int j=1;j<=t;j++)
for(int k=1;k<=len;k++) mat[a[j]][b[k]]=1;
} for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mat[i][j]) ind[j]++;
p1=1;p2=0;
for(int i=1;i<=n;i++)
if(!ind[i]) q[++p2]=i;
while(p1<=p2)
p1=p3+1;ans++;
} printf("%d\n",ans);
return 0;
}
noip2013 車站分級
一條單向的鐵路線上,依次有編號為 1,2,n1,2,n的 nn個火車站。每個火車站都有乙個級別,最低為 11 級。現有若干趟車次在這條線路上行駛,每一趟都滿足如下要求 如果這趟車次停靠了火車站 xx,則始發站 終點站之間所有級別大於等於火車站xx 的都必須停靠。注意 起始站和終點站自然也算作事先已知...
NOIP2013普及組 車站分級
題目 洛谷p1983 vijos p1851 codevs3294。題目大意 有一些車停靠某些站。現在要給所有站分級,規定一輛車停靠的所有站的最小級數必須大於 起點 終點 所有不停靠的站的最大級數。問至少分成幾種不同的級數?解題思路 由於停靠的站級數大於不停靠的站,我們把每列車停靠的站向不停靠的連一...
NOIp2013普及組 車站分級
思路 對於每一趟車,將區間內所有經停的站和所有未經停的站連一條邊,表示前者優先順序一定高於後者,然後用kahn跑一遍拓撲排序即可。然而這樣會創造大量多餘的邊,會tle1個點。考慮一種優化 因為每趟車本身也有乙個優先順序,因此可以將這趟車也看作乙個點,每次先所有將經停的站連一條邊到這兩車上,表示這些站...