题意:大概这样,给你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;
}