10分求调
查看原帖
10分求调
724221
ILoveSoviet楼主2023/5/14 12:49
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct edge{
    int u,v,next;
}e[1000010];
int cd[1000010],head[1000010],cnt,rd[1000010];
int add(int u,int v){
    e[++cnt].u=u;
    e[cnt].v=v;
    e[cnt].next=head[u];
    head[u]=cnt;
    rd[v]++;
    cd[u]++;
    return 0;
}
int m,n;
struct aa{
    queue <int> data;
    int mi;
    const bool operator<(const aa& rhs)const{
        return mi>rhs.mi;
    }
    aa(queue<int> a){
        data=a;
        mi=0x7f7f7f7f;
        while(!a.empty()){
            mi=min(mi,a.front());
            a.pop();
        }
    }
    aa();
    aa(int n){
        data.push(n);
        mi=n;
    }
};
aa tppx(int s){
    queue<int>q,ans;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        ans.push(u);
        priority_queue<int> yet;
        for(int i=head[u];i!=0;i=e[i].next){
            int v=e[i].v;
            rd[v]--;
            if(rd[v]==0)    yet.push(-v);
        }
        while(!yet.empty()){
            q.push(-yet.top());
            yet.pop();
        }
    }
    aa an(ans);
    return an;
}
void out(queue<int>q,queue<int> &to){
    while(!q.empty()){
        to.push(q.front());
        q.pop();        
    }
}
void doit(){
    memset(rd,0,sizeof(rd));
    memset(cd,0,sizeof(cd));
    memset(e,0,sizeof(e));
    memset(head,0,sizeof(head));
    cnt=0;
    cin>>m>>n;
    while(n--){
        int u,v;
        cin>>u>>v;
        add(u,v);
    }
    priority_queue<aa>ans,ans1;
    for(int i=1;i<=m;i++){
        if(rd[i]==0&&cd[i]==0)  ans.push((aa)i);
        else if(rd[i]==0)       ans.push(tppx(i));
    }
    int si=0;
    ans1=ans;
    while(!ans1.empty()){
        si+=ans1.top().data.size();
        ans1.pop();
    }
    if(si!=m)   cout<<" "<<si<<"Impossible!";
    else{
        while(!ans.empty()){
            aa p=ans.top();
            ans.pop();
            while(!p.data.empty()){
                cout<<p.data.front()<<" ";
                p.data.pop();
            }
        }
    }
    printf("\n");
}
int main(){
    int tim;
    cin>>tim;
    while(tim--)    doit();
}
2023/5/14 12:49
加载中...