hdu 4857 拓扑排序

来源:互联网 发布:金融超市源码 编辑:程序博客网 时间:2024/05/16 01:18
#include<stdio.h>  #include<string.h>  #include<algorithm>#include<queue>#include<math.h>using namespace std;struct node{    int u,next;}g[200000];int indegree[200000];int head[200000];int ans[200000];int top;void add(int a,int b){    g[top].u=b;    g[top].next=head[a];    head[a]=top++;}int main(){    int n,m;    int t;    scanf("%d",&t);    while(t--)    {scanf("%d%d",&n,&m);        memset(head,-1,sizeof(head));        memset(indegree,0,sizeof(indegree));        top=0;        for(int i=0;i<m;i++)        {            int a,b;            scanf("%d%d",&a,&b);            add(b,a);            indegree[a]++;        }        priority_queue<int>q;        int k=0;        for(int i=1;i<=n;i++)        {            if(indegree[i]==0)            {                q.push(i);            }        }        while(!q.empty())        {            int f=q.top();            ans[k++]=f;            q.pop();            for(int i=head[f];i!=-1;i=g[i].next)            {                int u=g[i].u;                indegree[u]--;                if(indegree[u]==0)                {                    q.push(u);                }            }        }        //printf("ok\n");       for(int i=k-1;i>=0;i--)       {           if(i!=k-1)           printf(" %d",ans[i]);           else printf("%d",ans[i]);       }       printf("\n");    }}