泛做 $1$

代码已更。 

[] 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;
}
View Code

相关文章: