求调:
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
using namespace std;
int n,m,ind[100001],ans[100001];
vector<int>path[100001],edge[100001];
void tu(int x){
for(int i=1;i<=n;i++) edge[i].clear(),ind[i]=0;
for(int i=1;i<=m;i++){
for(int j=1;j<path[i].size();j++){
edge[path[i][j-1]].push_back(path[i][j]);
ind[path[i][j]]++;
}
}
}
bool topo(int x){
tu(x);
priority_queue<int,vector<int>,greater<int> >q;
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++) if(!ind[i]) q.push(i);
int cnt=0;
while(!q.empty()){
int u=q.top();
q.pop();
cnt++;
ans[cnt]=u;
for(auto v:edge[u]){
ind[v]--;
if(!ind[v]) q.push(v);
}
}
return cnt==n;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x;
cin>>x;
for(int j=1;j<=x;j++){
int y;
cin>>y;
path[i].push_back(y);
}
}
int l=0,r=m;
while(l<r){
int mid=(l+r+1)/2;
if(topo(mid)) l=mid;
else r=mid-1;
}
topo(l);
for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
return 0;
}