代码已更。
[] CF1463E
缩点拓扑
#include<iostream> #include<cstring> #include<cstdio> #include<climits> #include<algorithm> #include<queue> #include<vector> #define pii pair<int,int> #define mp make_pair #define pb push_back #define fi first #define se second using namespace std; inline int read(){ int f=1,ans=0; char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+c-'0';c=getchar();} return f*ans; } const int MAXN=3e5+11; vector<int> vec[MAXN],vec1[MAXN],C[MAXN],Ans; int N,K,d[MAXN],col[MAXN],X[MAXN],Y[MAXN],fa[MAXN],vis[MAXN]; queue<int> que; void print(){printf("0\n");exit(0);} void ins(int x){for(auto v:C[x]) Ans.pb(v);return;} void dfs(int u){col[u]=col[0];C[col[0]].pb(u); for(auto v:vec1[u]){if(col[v]) print();dfs(v);}return;} int main(){ //freopen("1.in","r",stdin); N=read(),K=read(); for(int i=1;i<=N;i++) X[i]=read(),Y[i]=i,fa[i]=X[i]; for(int i=1;i<=K;i++) {int u=read(),v=read();d[v]++;vec1[u].pb(v);} for(int i=1;i<=K;i++) if(vec1[i].size()>1) print(); for(int i=1;i<=N;i++){ if(!d[i]){col[0]++; dfs(i);} } memset(d,0,sizeof(d)); for(int i=1;i<=N;i++) if(col[X[i]]!=col[Y[i]]&&X[i]) vec[col[X[i]]].pb(col[Y[i]]),d[col[Y[i]]]++; for(int i=1;i<=col[0];i++) if(!d[i]) que.push(i),ins(i); while(!que.empty()){ int xx=que.front(); que.pop(); for(auto v:vec[xx]){ d[v]--; if(!d[v]){que.push(v),ins(v);} } } if(Ans.size()!=N) print(); vis[0]=1; for(auto v:Ans){ if(!vis[fa[v]]) print(); vis[v]=1; } for(auto v:Ans) printf("%d ",v);printf("\n"); return 0; }