UVALive 6195 The Dueling Philosophers Problem 解题报告

题意:给出一些论文,一些会被另一些引用,被引用的论文必须排在引用它的论文的前面。如果存在大于一个个合法的顺序输出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;
}


你可能感兴趣的:(UVALive 6195 The Dueling Philosophers Problem 解题报告)