拓扑排序简介

本文简要介绍了拓扑排序的概念,它是图论中的一个重要算法,常用于解决依赖关系的排序问题。2010年的这篇文章带你了解拓扑排序的基本思想和应用。
摘要由CSDN通过智能技术生成
拓扑排序简介
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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值