您的位置:首页 > 其它

AOE图及拓扑排序

2017-01-07 17:00 211 查看
有向无环图通常来表示活动之间的先后关系,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;
}拓扑排序在判断有向无环,进行关键路径求解时很有必要。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: