poj 2367 拓扑排序

来源:互联网 发布:姗姗手账小铺 淘宝 编辑:程序博客网 时间:2024/05/20 04:08

传送门

题意:我表示没看完,看输入输出就猜出意思了。

思路:根据拓扑排序随便输出可行序列。

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;int n,fst[105],next[10000],node[10000];int en,in[105],ans[105],num;void add(int u,int v){    next[en]=fst[u];    fst[u]=en;    node[en]=v;    en++;}void topsort(){    queue<int>q;    for(int i=1;i<=n;i++)    {        if(in[i]==0)q.push(i);    }    while(!q.empty())    {        int u=q.front();        ans[num++]=u;        q.pop();        for(int i=fst[u];i!=-1;i=next[i])        {            int v=node[i];            in[v]--;            if(in[v]==0)q.push(v);        }    }}int main(){    int u,v;    en=0;    num=0;    memset(in,0,sizeof(in));    memset(fst,-1,sizeof(fst));    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        while(scanf("%d",&u))        {            if(u==0)break;            add(i,u);            in[u]++;        }    }    topsort();    printf("%d",ans[0]);    for(int i=1;i<n;i++)printf(" %d",ans[i]);    printf("\n");    return 0;}