P1983 車站分級(拓撲排序)
思路 :將每個車次車站的關係抽象化爲邊的關係,不停靠的車站等級肯定比停靠的車站等級低,因此可以建立一條邊,然後就用拓撲排序搞搞就行了,注意判斷重邊。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+5;
#define mst(a) memset(a,0,sizeof a)
int n,m,in[N],vis[N],a[N];
bool edge[N][N];
vector<int>e[N];
int toposort(){
queue<pair<int,int> >q;
int ans=1;
for(int i=1;i<=n;i++) if(!in[i]) q.push({i,1});
while(q.size()){
int u=q.front().first;
int g=q.front().second;
q.pop();
for(auto v:e[u]){
in[v]--;
if(!in[v]) q.push({v,g+1}),ans=max(ans,g+1);//找到最大等級.
}
}
return ans;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1,cnt;i<=m;i++){
scanf("%d",&cnt);
mst(vis);
for(int j=1;j<=cnt;j++)
scanf("%d",&a[j]),vis[a[j]]=1;
for(int j=a[1];j<=a[cnt];j++)
if(!vis[j])
for(int k=1;k<=cnt;k++)
if(!edge[j][a[k]]) edge[j][a[k]]=1,e[j].push_back(a[k]),in[a[k]]++;
}
printf("%d\n",toposort());
return 0;
}