用的拓扑排序 + 最长上升子序列
一直过不去
#include<bits/stdc++.h>
// #define DEBUG
using namespace std;
int n;
vector<vector<int> >e;
vector<int> deg;
vector<int> ans;
vector<int> dp;
int calc(){
dp.assign(n+5,0);
dp[0]=INT_MAX;
int cnt=0;
for(int i=0;i<n;i++){
if(ans[i]<=dp[cnt]) dp[++cnt]=ans[i];
else{
int l=1,r=cnt;
while(l<r){
int mid=(l+r)>>1;
if(dp[mid]<ans[i]) r=mid;
else l=mid+1;
}
dp[l]=ans[i];
}
}
return cnt;
}
bool toposort(){
ans.clear();
priority_queue<int,vector<int>,greater<int> > q;
for(int i=1;i<=n;i++){
if(!deg[i]) q.emplace(i);
}
while(!q.empty()){
int u=q.top();q.pop();
cout<<u<<' ';
ans.emplace_back(u);
for(int v:e[u]){
if(!--deg[v]) q.emplace(v);
}
}
return ans.size()==n;
}
void solve(){
cin>>n;
deg.assign(n+5,0);
e.assign(n+5,vector<int>());
for(int i=1,cnt;i<=n;i++){
cin>>cnt;
for(int j=1,v;j<=cnt;j++){
cin>>v;
e[v].emplace_back(i);
deg[i]++;
}
}
for(int i=1;i<=n;i++) sort(e[i].begin(),e[i].end());
if(!toposort()){
cout<<-1<<'\n';
return ;
}
#ifdef DEBUG
for(int i:ans) cout<<i<<' ';
cout<<'\n';
#endif
cout<<calc()<<'\n';
}
int main(){
int t;
cin>>t;
while(t--) solve();
return 0;
}
/*
1
5
1 2
1 5
2 4 1
1 2
0
*/