Ordering Tasks
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/fd4963538b83984443c37b847bb6e9b1.png)
大意:
有n个任务要执行,执行一个任务后才能执行另一个任务,另外任务有优先度。要求打印输出任务可能执行的顺序。
解题思路:
典型的拓扑排序题目,每次将有关系的任务之间标记一下,根据出现次数记录入读。找到入读为0的点,先将其记录并标记,然后使与之相连的点入度减一。最后输出。
代码
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m,book[1010][1010];
struct node
{
int x,y;
}s[1010];
int main()
{
while(~scanf("%d%d",&n,&m)&&n+m)
{
int l=0,k,a,b,i,j;
memset(s,0,sizeof(s));
memset(book,0,sizeof(book));
for(i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
if(book[a][b]==0)
{
book[a][b]=1; //有关系的标记一下
s[b].x++;
} //记录入度
}
for(i=0;i<n;i++)
{
for(j=1;j<=n;j++)
{
if(s[j].x==0)
{
k=j; //找到入度为零的点
break;
}
}
s[l++].y=k; //记录到数组中
s[k].x=-1; //入读标记为-1
for(j=1;j<=n;j++)
{
if(book[k][j]==1) //与当前点相连的点
s[j].x--; //入度--
}
}
for(i=0;i<l;i++)
{
if(i!=l-1)
printf("%d ",s[i].y);
else
printf("%d\n",s[i].y);
}
}
return 0;
}