这一题的意思是完成某项工作的前提是先完成另一项工作,给出部分先后顺序,判断出全部工作完成的顺序,可能会有多个答案,输出一个即可。
例如 有5个工作
有4个部分顺序,1在2的前面,2在3的前面,1在3的前面,1在5的前面。
可知1、2、3的先后顺序不变,1、5的先后顺序不变,中间可以插其他的元素,
而4可以放在任意位置。
这一题就是一个拓扑排序,将前面带有限定元素的标记起来,每有一个就加一。每次当它前面的限定元素输出后就减一,直到为0后输出。
#include<stdio.h>
#include<string.h>
int n,m,book[1010][1010];
struct w
{
int x,y;
}s[1010];
int main()
{
while(~scanf("%d%d",&n,&m)&&n+m)
{
int a,b;
memset(s,0,sizeof(s));
memset(book,0,sizeof(book));
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(book[a][b]==0)
{
book[a][b]=1;//将它们的关系用二维数组标记起来,当a出列,此时b才有可能出列
s[b].x++;