题目
思路
由题意得,所有停靠站之间没有停靠的站的等级一定小于停靠站。所以将起点到终点之间未停靠的站连边,进行拓扑排序,统计一共分了多少级(层数),即为所求解的答案。
由例2的建边自行理解一下;
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=2e3+10;
const int mod=100003;
int a[N],in[N];
bool vis[N][N];
vector<int>v[N];
queue<pair<int,int>>q;
int n;
int tp(){
int ans=1;
for(int i=1;i<=n;i++){
if(in[i]==0)q.push({i,1});
}
while(!q.empty()){
int x=q.front().first,level=q.front().second;
q.pop();
for(int i=0;i<v[x].size();i++){
int y=v[x][i];
in[y]--;
if(!in[y]){
q.push({y,level+1});
ans=max(ans,level+1);
}
}
}
return ans;
}
int main(){
int m,x;
cin>>n>>m;
while(m--){
cin>>x;
bool pan[N]={false};
for(int i=1;i<=x;i++){
cin>>a[i];
pan[a[i]]=1;
}
for(int i=a[1];i<a[x];i++){
if(!pan[i]){//不是停靠站
for(int j=1;j<=x;j++){
if(!vis[i][a[j]]){//此边未加过
in[a[j]]++;
vis[i][a[j]]=1;
v[i].push_back(a[j]);//未停靠站->停靠站
// cout<<i<<"->"<<a[j]<<endl;
}
}
}
}
}
cout<<tp()<<endl;
return 0;
}
时隔“多年”遇到一个没想到拓扑解法的”好题“记录一下(是我辣鸡