拓扑排序简介

来源:互联网 发布:拼图很多图软件 编辑:程序博客网 时间:2024/05/29 18:04
拓扑排序简介
2010-08-16 11:19
简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。离散数学中关于偏序和全序的定义:
  若集合X上的关系是R是自反的、反对称的和传递的,则称R是集合X上的偏序关系。
  设R是集合X上的偏序(Partial Order),如果对每个x,y属于X必有xRy 或 yRx,则称R是集合X上的全序关系。
  注意:
  ①若将图中顶点按拓扑次序排成一行,则图中所有的有向边均是从左指向右的。
  ②若图中存在有向环,则不可能使顶点满足拓扑次序。

  ③一个DAG的拓扑序列通常表示某种方案切实可行。

拓扑排序的方法和步骤:

(1)在图中选一个没有前趋的顶点并输出之

(2)删除该顶点及由它发出的各边,直到图中不存在没有前趋的顶点为止。

若图中存在回路,拓扑排序无法进行。

以下是将一AOV网进行拓扑排序的算法:

网采用邻接矩阵A表示,若a[i,j]=1,表示活动i先于j,a[i,j]=0,表示活动i与j不存在先后关系。

(1)计算各顶点的入度 

(2)找入度为零的点输出之,删除该点,且与该点关联各点的入度减1 

(3)若所有顶点都输出完毕。

模板:

int tuopu(int a[505][505])
{
for(i=1;i<=n;i++)
{
   for(j=1;j<=n;j++)
   {
    if(a[i][j]>0) into[j]++;
   }
}
into[0]=1;
for(i=1;i<=n;i++)
{
   j=0;
   while(into[j]!=0)
   {
    j++;
    if(j>n) return 0;//如果有环就无法排序
   }
   result[i]=j;
   into[j]=-1;
   for(k=1;k<=n;k++)
   {
    if(a[j][k]>0) into[k]--;
   }
}   cout<<result[1];
   for(i=2;i<=n;i++)
   {
    cout<<" "<<result[i];
   }
            cout<<endl;
    return 1;
}

原创粉丝点击