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