UVAlive 6195 拓扑排序 描述巨坑

来源:互联网 发布:拒绝帮助别人知乎 编辑:程序博客网 时间:2024/05/16 15:31

传送门

题意:大概这样,给你n个点,m条边,边(u,v)代表u必须在v前面,问最后的排列方法数量,没发排输出0,只能1种输出1,大于1种输出2。

思路:一开始不知道拓扑排序,就在瞎搞,wa了一地的节操啊。后来就拓扑过了。

吐槽:说好的m不为0的呢,说好的m不大于50000的呢,边开了500000才过啊有木有。

#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;int fst[1005],next[500010],node[500010];int in[1005],m,n,num;int topu(){    int flag=0;    int cnt=0;    queue<int>q;    for(int i=1;i<=n;i++)    {        if(!in[i])        {            q.push(i);            cnt++;        }    }    while(!q.empty())    {        if(q.size()>1)        {            flag=1;        }        int u=q.front();        q.pop();        for(int i=fst[u];i!=-1;i=next[i])        {            int v=node[i];            in[v]--;            if(!in[v])            {                q.push(v);                cnt++;            }        }    }    if(cnt<n)return 0;    else if(flag)return 2;    else return 1;}int main(){    int u,v;    while(scanf("%d%d",&n,&m))    {        if(n==0&&m==0)break;        num=0;        memset(fst,-1,sizeof(fst));        memset(in,0,sizeof(in));        for(int i=0;i<m;i++)        {            scanf("%d%d",&u,&v);            in[v]++;            next[++num]=fst[u];            fst[u]=num;            node[num]=v;        }        printf("%d\n",topu());    }    return 0;}