グレーディング駅
タイトル説明
一方向鉄道線は、順次1,2、...、nはn番目のステーションが番号付けされています。各レベルは、鉄道駅、レベル1の最小値を有します。この行で、従来の列車に数回、次の要件を満たしています各パス:駅ストップツアーは、x、その後、発信局、X必見ドッキングステーションのすべてのレベルの間の端末以上をトリップした場合。(注:出発駅と天然停止部位とみなされることが知られているアプリオリに端末ニーズ)
例えば、表5に列車の運転の図です。駅3(ステージ2)の停止ので、4回の要件を満たすフロント列車、及び5回目は、局番号6(また、レベル2)を介して、ドッキングされていない請求項の要件を満たしません。
既存の列車運行のm倍(全て満たす要件)、少なくともいくつかの異なるレベルにN推定試験ステーション。
入力形式
最初の行は、スペースで区切られた2つの正の整数N、Mを含有します。
全て停止することを示す、S_Iは正の整数であり; I + 1行(1≤i≤m)、第一の正の整数、S_I(2≤S_I≤n)は、i番目の列が外S_I回停止表します昇順の番号。それぞれ2つの数字の間のスペースで区切られています。入力は旅行のすべての要件を満たすためにあることを確認します。
出力フォーマット
分割レベルN駅の最小数は正の整数。
この質問は、それが最大値との間隔で木のラインを維持することはできませんし、その後左右にすることを考え始めたトポロジー、考えることは困難である
駅のレベルを停止し、比較して、間違いを参照してください最後に修正します。
正のソリューションは、各パスのための旅行、記録そのドッキング部位であるべきである。その後、すべての非停車駅ジ列挙[1]ジ[S]に対する各非ドッキング部位でサイトをドッキングすべての旅行側に建設されました。最後に、その後、最大パスを見つけ、再びトポロジーを実行します。
コード:
#include<bits/stdc++.h>
#define LL long long
#define pa pair<int,int>
#define ls k<<1
#define rs k<<1|1
#define inf 0x3f3f3f3f
using namespace std;
const int N=100010;
const int M=2000100;
const LL mod=2e9;
int n,m,cnt,head[N],di[N],in[N],dp[N],ans;
bool vis[N],vit[1100][1100];
struct Node{
int to,nex;
}edge[M];
void add(int p,int q){
edge[cnt].nex=head[p];
edge[cnt].to=q;
head[p]=cnt++;
}
void bfs(){
queue<int>qu;
for(int i=1;i<=n;i++) if(!in[i]) qu.push(i),dp[i]=1;
while(!qu.empty()){
int u=qu.front();
qu.pop();
for(int i=head[u];~i;i=edge[i].nex){
int v=edge[i].to;
dp[v]=max(dp[v],dp[u]+1);
ans=max(dp[v],ans);
in[v]--;
if(!in[v]) qu.push(v);
}
}
}
int main(){
memset(head,-1,sizeof(head));
cin>>n>>m;
for(int i=1;i<=m;i++){
memset(vis,false,sizeof(vis));
int s;
scanf("%d",&s);
for(int j=1;j<=s;j++) scanf("%d",&di[j]),vis[di[j]]=true;
for(int j=di[1];j<=di[s];j++){
if(vis[j]) continue;
for(int k=1;k<=s;k++){
if(vit[j][di[k]]) continue;
vit[j][di[k]]=true;
add(j,di[k]),in[di[k]]++;
}
}
}
bfs();
cout<<ans<<endl;
return 0;
}