AOE图及拓扑排序

有向无环图通常来表示活动之间的先后关系,AOV图中顶点表示活动,有向的边表示活动间的先后关系,例如边<u,v>表示活动u是获得v发生的前提,很明显,这种图不应该存在环(<u,u>)即不应该某活动以自身为先决条件。

如图是一个有向无环图。

拓扑排序:一具有n个顶点的有向无环图,其顶点序列v1,v2,...vn满足<vi,vj>边存在时,该序列组成拓扑序列,它是对有向无环图的顶点的一种排序。

可以在AOV中进行拓扑排序来证明该图中是否存在有向回路。

最简单思路:

1 先找出任意一个入度为0的顶点,显示该顶点并将它及其边从图中删除。

2 对图中其他顶点同样的处理

其伪代码如下:

int topsort(graph a){
int count;
vertex v;
for(count=0;count<totalnum;count++)
{
v=Find_zerodegree();//找出入度0的一个顶点
if(v==Nonv)
{cout<<"无入度0的点";break;}
  for nodes i adjacent to v
   indegree[i]--;//相连的顶点入度减1
  } 
}
简单分析Find_zerodegree函数扫描一个入度0的节点需O(n)可知该算法运行时间O(n^2).

这种算法对于稠密图尚可,若对于稀疏图,每次迭代期间只有一些顶点的入度更新,没有必要像Find_zerodegree那样查看所有的顶点。故改进上述算法。

通过将所有入度为0的顶点放在一个容器(引入队列或者栈)。其思路是:

1 首先将图中入度0的顶点放入容器

2 当容器不为空时取出一个顶点,并将与该顶点相邻的所有顶点入度减1

3 只要存在入度为0的入容器

如下是通过栈实现(队列实现类似)

int graph_link::topsort_AOV(int topsort[]){
int i,j,k=0;
enode*p=NULL;
int st[M],top=-1;
//先选择一个入度为0的顶点
for(i=0;i<n;i++)
    if(nodetable[i].count==0)
    {top++;st[top]=i;}
while(top>-1){
    int t=st[top--];
    topsort[k++]=t;
    p=nodetable[t].first;
    while(p){j=p->endnode;nodetable[j].count--;
	if(nodetable[j].count==0){top++;st[top]=j;}
	p=p->next;
            }
              }
if(k<n)return 0;
else return 1;
}
拓扑排序在判断有向无环,进行关键路径求解时很有必要。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值