P1983車站分級

2022-04-12 03:20:37 字數 1559 閱讀 6058

%%%rqy

傳送

我們注意到題目中這段話:

既然大於等於x的站都要停,那麼不停的站的級別是不是都小於x?(這裡討論在始發站和終點站以內的站(注意這裡是個坑))

我們可以找出每趟車沒停的站,向所有停了的站建一條邊,表示沒停的站的級別《停了的站的級別,同時記錄所有的站的入度

這樣,一開始入度為0的站級別就是1。

對於那些入度不為0的點來說,它們的級別就是所有指向它的點中,級別最大的那個點的級別+1

for example

因為每個級別為a車站x不一定只有級別為a-1的車站向x連邊。

那程式怎麼實現呢?

據大佬說要跑拓撲排序(%%%ych)

簡單的說:

先將所有入度為0的點入隊,遍歷它們的每條出邊,將所有到達的點的入度-1。如果有入度為0的點,就將其入隊,並且它的級別為當前出隊的點的級別+1。當隊空時,拓撲排序結束。

這樣為什麼能保證達到上圖的效果呢?因為對於任意一點i來說,如果當前出隊的點為j,若存在有連線i且級別比j大的點k,則k此時入度一定不為0(還沒遍歷j的出邊時),就可以保證先算k的級別,再算i的級別了。

複雜的說,走這裡

跑完拓撲排序,我們將所有點的級別sort一遍,找最大的,就是答案。

小坑見**

#include#include

#include

#include

#include

#include

using

namespace

std;

int aans,n,m,s[1005][1005],in[1005],head[1005],cnt,ans[1005

];bool jb[1005][1005];//

b[i][j]為i到j是否建過邊(不建重邊)

queue q;

struct

edgeedge[

10000005];//

開大點(我也不知道最多有幾條邊,總之開小了會wa)

void add(int fr,int to)//

前向星存圖

intmain()

start=s[i][1];end=s[i][s[i][0

]];

for(int j=start;j<=end;j++)//

注意一定是討論始發站和終點站以內的車站(見樣例)}}

}

}for(int i=1;i<=n;i++)

}while(!q.empty())//

跑拓撲排序}}

sort(ans+1,ans+1+n);

printf("%d

",ans[n]);

}

P1983 車站分級

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

P1983 車站分級

題意 如果標號為x的站點有車停靠,那麼出發點到終點站的所有大於等於x的等級的站點都需要停靠,問最少需要多少個等級的站點 做法 如果某個點沒有車停靠,說明這個點的等級小於其他所有有車停靠的站點等級,於是連邊,最後跑一邊拓撲,求最大深度 一開始理解錯題意了,誤以為是從該點到終點站而不是出發點到終點站,於...

P1983 車站分級

傳送門 這道題有拓撲排序的思想,題目中給出級別大於或者等於的火車站都得停下來。換言之沒有停下來的等級就是比他小,我們要求出最大的層數。求層數也有點像bfs了 include using namespace std const int maxn 1e3 10 int e maxn maxn int r...