HDU3687


#include<iostream>

#include<string>

#include<stack>

#include<cmath>

#define M 210

using namespace std;

 

int in[M],map[M][M],ans[M],flag;

 

void topsort(int n)

{

	int i,j,k=n;

	while(k>=1)

	{

		for(i=n;i>=1;i--)

			if(in[i]==0)

			{

				for(j=1;j<=n;j++)        //与i相同的球,入度-1

					if(map[i][j]==1)  

						in[j]--;

				in[i]--;   //自身也-1

				ans[i]=k--; //赋值,附上大的那个//这主要是向后插入,来个编号最大的球,看看可以插哪儿。

				break;

			}

			

		if(i==0) {flag=0;break;} //如果陷入死循环,则退出 

	}

}

 

int main()

{

	int t,n,m,i,a,b;

	cin>>t;

	while(t--)

	{

		scanf("%d%d",&n,&m);

		memset(in,0,sizeof(in));

		memset(map,0,sizeof(map));

		flag=1;

		for(i=0;i<m;i++)

		{

			scanf("%d%d",&a,&b);

			if(a!=b)            //防止相等

			{

				if(map[b][a]==0)  //注意判断重边

				{

					map[b][a]=1;

					in[a]++;

				}

			}

			else flag=0;

			

		}

 

		if(flag)

		{

			topsort(n);

			

			if(flag==0)       //如果陷入死循环则输出-1

			{

				printf("-1\n");continue;

			}

			

			for(i=1;i<=n;i++)

				printf("%d ",ans[i]);

			cout<<endl;

		}

		else printf("-1\n");

	}

}

 

POJ1128农场很有趣,但没做,对于我有点难

poj1270也不错,没做

1420看不懂

点赞