题意:给出一些论文,一些会被另一些引用,被引用的论文必须排在引用它的论文的前面。如果存在大于一个个合法的顺序输出2,存在一个输出1,不存在输出0.
解法:裸的拓扑排序,但题目m的数据范围少了一个0,被坑了一下午,天灾人货
//time 162 MS
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 50015;
struct Edge{
int v,next;
}edge[maxn*10];
int head[maxn],ind[maxn],en;
void addedge(int u,int v)
{
edge[en].v=v;
edge[en].next=head[u];
head[u]=en++;
}
void init()
{
memset(head,-1,sizeof(head));
memset(ind,0,sizeof(ind));
en = 0;
}
int toposort(int n)
{
int u,cnt=0;
bool flag=0;
queue<int> q;
for(int i=1;i<=n;i++)
if(ind[i]==0) q.push(i);
while(!q.empty())
{
cnt++;
if(q.size()>1) flag = 1;
u=q.front(),q.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].v;
ind[v]--;
if(ind[v]==0)q.push(v);
}
}
if(cnt!=n) return 0;
if(flag==1) return 2;
return 1;
}
int main()
{
//freopen("in.txt","r",stdin);
int n,m;
int u,v;
while(scanf("%d%d",&n,&m)&&(n+m))
{
init();
for(int i = 0; i < m; i++)
{
scanf("%d%d",&u,&v);
addedge(u,v);
++ind[v];
}
printf("%d\n",toposort(n));
}
return 0;
}