其他分享
首页 > 其他分享> > Luogu P3243 [HNOI2015]菜肴制作

Luogu P3243 [HNOI2015]菜肴制作

作者:互联网

题目
题目要求的顺序很像是字典序最小,不过并不是,所以不能够直接跑最小拓扑序。
不过我们可以发现这个顺序实际上就是反向图上最大拓扑序的reverse。
对于限制\(u,v\),我们建\(v->u\)这样一条边。
然后开个堆跑最大拓扑序。
判断一下是否无解,然后反向输出即可。

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int N=100007;
vector<int>E[N];
int vis[N],deg[N],a[N];
priority_queue<int>q;
int read(){int x;scanf("%d",&x);return x;}
int main()
{
    int T,n,m,u,v,i,cnt=0,tot;
    for(T=read();T;--T)
    {
    n=read(),m=read(),memset(deg,0,sizeof deg),memset(vis,0,sizeof vis),cnt=tot=0;
    for(i=1;i<=n;++i) E[i].clear();
    for(i=1;i<=m;++i) v=read(),u=read(),E[u].pb(v),++deg[v];
    for(i=1;i<=n;++i) if(!deg[i]) q.push(i),vis[i]=1,++cnt;
    while(!q.empty())
    {
        u=q.top(),q.pop(),a[++tot]=u;
        for(int v:E[u])
        {
        --deg[v];
        if(!deg[v]&&!vis[v]) q.push(v),vis[v]=1,++cnt;
        }
    }
    if(cnt^n) {puts("Impossible!");continue;}
    for(i=n;i;--i) printf("%d ",a[i]);
    puts("");
    }
}

标签:vis,int,Luogu,拓扑,tot,read,HNOI2015,P3243,deg
来源: https://www.cnblogs.com/cjoierShiina-Mashiro/p/11594001.html