【BZOJ4010】【HNOI2015】菜肴制作

来源:互联网 发布:python 推荐书籍 编辑:程序博客网 时间:2024/05/15 03:37

链接:

#include <stdio.h>int main(){    puts("转载请注明出处[vmurder]谢谢");    puts("网址:blog.csdn.net/vmurder/article/details/45365831");}

题解:

把所有入度为0的点入优先队列,每次取出标号最大的,并将此点取走后入度为0的点入优先队列,最后反序输出。

代码:

#include <queue>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define N 101000#define M 101000using namespace std;struct Eli{    int v,next;}e[M];int head[N],cnt,d[N];inline void add(int u,int v){    d[v]++;    e[++cnt].v=v;    e[cnt].next=head[u];    head[u]=cnt;}priority_queue<int>q;int ans[N],n,m;int main(){    freopen("test.in","r",stdin);    int i,j,k;    int a,b,c;    int g;for(scanf("%d",&g);g--;)    {        memset(head,0,sizeof head);        memset(d,0,sizeof d);        scanf("%d%d",&n,&m);        cnt=0;        while(m--)        {            scanf("%d%d",&a,&b);            add(b,a);        }        m=0;        for(i=1;i<=n;i++)if(!d[i])q.push(i);        while(!q.empty())        {            ans[++m]=q.top(),q.pop();            for(i=head[ans[m]];i;i=e[i].next)                if(!--d[e[i].v])q.push(e[i].v);        }        if(m!=n)puts("Impossible!");        else {while(m)printf("%d ",ans[m--]);puts("");}    }}
0 0
原创粉丝点击