思想都在代码的注释里了
由入度为0的节点开始向下深搜,感觉拓扑排序可以用于学校领导的讲话,比如谁谁不能在谁谁前面发言,然后利用这个写一个发言顺序
AC代码:
#include <stdio.h>
#include <string.h>
#define N 100
int data[N+1][N+1]; //data[i][j]判断第i个节点的第j个后代是否存在,1就是存在,非1不存在
int n,in[N+1],output[N+1]; //in[i]代表第i个节点的入度
void tp_sort()
{
int i,j,temp;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(in[j]==0)
{
temp=j; //记录入度为0的节点
break;
}
}
in[j]--; //该节点入度改为任意不影响循环的值
output[i]=temp;
for(j=1;j<=n;j++) //处理该节点的后代
{
if(data[temp][j]==1) //该节点指向了后代j
{
data[temp][j]=0;
in[j]--; //该节点已经输出,故j的入度-1
}
}
}
}
int main ()
{
int i,j=1,child;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
while(scanf("%d",&child)&&child!=0)
{
data[i][child]=1; //data[i][j]判断第i个节点的第j个后代存在/有由i指向j的线
in[child]++; //第child个节点的入度+1
}
}
tp_sort();
for(j=1;j<=n;j++)
printf("%d ",output[j]);
return 0;
}
//poj 2367