[2017纪中11-2]字典序 拓扑排序+优先队列

来源:互联网 发布:.us域名查询 编辑:程序博客网 时间:2024/05/16 08:06

题面
拓扑排序的时候每次取出最小点就是了。。。
代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>#include<vector>using namespace std;const int maxn=100010;int n,m,rd[maxn],ans[maxn];priority_queue <int,vector<int>,greater<int> > a;struct edge{    int t;    edge *next;}*con[maxn];int read(){    int x=0;    char ch=getchar();    while(ch<'0'||ch>'9') ch=getchar();    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}    return x;}void ins(int x,int y){    edge *p=new edge;    p->t=y;    p->next=con[x];    con[x]=p;}int main(){    n=read();m=read();    for(int i=1;i<=m;i++)    {        int x=read(),y=read();        ins(x,y);        rd[y]++;    }    for(int i=1;i<=n;i++)        if(rd[i]==0) a.push(i);    for(int i=1;i<=n;i++)    {        if(a.empty()) {puts("-1");return 0;}            ans[i]=a.top();        a.pop();        for(edge *p=con[ans[i]];p!=NULL;p=p->next)        {            rd[p->t]--;            if(rd[p->t]==0) a.push(p->t);         }    }       for(int i=1;i<=n;i++)        printf("%d ",ans[i]);    return 0;}
原创粉丝点击