void toposort(int n)
{//该方法将优先队列(每次取出最大值)和拓扑排序结合
int i;
priority_queue<int> q;
for(i=1;i<=n;i++)
if(indegree[i]==0)q.push(i);
int t,k=0,j;
while(!q.empty())
{
t=q.top();
q.pop();
ans[k++]=t;
int tt=graph[t].size();
for(j=0;j<tt;j++)
{
indegree[graph[t][j]]--;
if( indegree[graph[t][j]]==0)
q.push(graph[t][j]);
}
}
}
for(i=0;i<n;i++)//可直接嵌套入主函数中,邻接数组,简单易懂!
{
for(j=1;j<=n;j++)
{
if(indegree[j]==0)
{
indegree[j]=-1;
if(T==0)
printf("%d",j),T++;
else
printf(" %d",j);
for(k=1;k<=n;k++)
{
if(graph[j][k]==1)indegree[k]--;
}
break;
}
}
}
int toposort(int n)
{//通过建立标志值,判定各种条件。用于限制条件较多的题目。
int in[MAX];
memcpy(in,indegree,sizeof(indegree));
stack<int > s;
int i;
for(i=0;i<n;i++)
if(in[i]==0)
s.push(i);
int flag=0;
int t,j=0;
while(!s.empty())
{
if(s.size()>1)
flag=1;
t=s.top();
s.pop();
rem[j++]=t;
for(i=0;i<n;i++)
if(graph[t][i]!=0)
if(--in[i]==0)
s.push(i);
}
if(j!=n)
return 1;
else if(flag==1)
return 2;
return 0;
}