载入中...
 
     
 
载入中...
时 间 记 忆
载入中...
最 新 评 论
载入中...
专 题 分 类
载入中...
最 新 日 志
载入中...
最 新 留 言
载入中...
搜 索
用 户 登 录
载入中...
友 情 连 接
博 客 信 息
载入中...


 
 
载入中...
   
 
 
拓扑排序算法
[ 2008-9-16 19:44:00 | By: wantnon ]
 
1,求G中各顶点入度;
   入度为0者加入S;
   如果S为空,有环,退出。
2,从S中任取一点输出到S';
   更新各顶点入度;
   入度为0者加入S;
   如果S为空且G-S-S'不为空,有环,退出;
   如果S为空且G-S-S'为空,排序完毕,终止;
   返回2;
此时S'中所存即为拓扑排序结果。
注:
1,S'保存当前已摘掉的顶点。
2,S保存当前G-S'中无前驱顶点。
C++程序:
#i nclude<iostream.h>
TopolSort(double vvmat[][MAXNL+1],int Nv)
{
    int i,j;
    int S_[MAXNL+1]={0};//保存已摘掉的顶点(终止时为所求结果)
    int nS_=0;//S_的大小
    int S[MAXNL+1]={0};//保存未摘掉的顶点中入度为0者
    int nS=0;//S的大小
    int indeg[MAXNL+1]={0};//各点剩余入度
    //初始化indeg
    for(i=1;i<=Nv;i++)//搜各顶点
    {//求顶点i的入度
        int sum=0;
        for(j=1;j<=Nv;j++)//搜点i的邻接点
            if(vvmat[j][i])sum++;
        indeg[i]=sum;//得到顶点i的入度
        if(indeg[i]==0)//如果入度为0,则加入到S
            S[++nS]=i;
    }//indeg初始完毕
    if(nS==0)//如果S为空,说明根本不存在源
    {
        cout<<"错误:有环! 1"<<endl;
        exit(1);
    }
    //循环
    while(1)
    {
        //从S中任取一个顶点输出到S_
        int ver=S[nS--];
        S_[++nS_]=ver;
        //更新indeg
        for(i=1;i<=Nv;i++)//搜ver的邻接点
        {
            if(vvmat[ver][i])
            {//如果i是ver的邻接点
                indeg[i]--;
                if(indeg[i]==0)//如果i的入度为0,则加进S
                    S[++nS]=i;
            }
        }
        if(nS==0)
        {
            if(Nv-nS-nS_==0)
            {
                break;
            }else
            {
                cout<<"错误:有环! 2"<<endl;
                exit(1);
            }
        }
    }
    //输出结果
    for(i=1;i<=Nv;i++)
        cout<<S_[i]<<"→";
    cout<<endl;
}

 
 
发表评论:
载入中...
 
     
   
     
Powered by Oblog.