函数库 拓扑排序

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;
}



posted on 2014-07-29 16:39  一锅土豆  阅读(166)  评论(0编辑  收藏  举报