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;
}拓扑排序在判断有向无环,进行关键路径求解时很有必要。
如图是一个有向无环图。
拓扑排序:一具有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;
}拓扑排序在判断有向无环,进行关键路径求解时很有必要。
相关文章推荐
- 拓扑排序与AOE图关键路径
- 关键路径(AOE)—基于拓扑排序(AOV)
- 拓扑排序AOV和AOE
- Python实现AOV网络——拓扑排序,AOE网络——关键路径
- 数据结构 学习笔记(九):图(下):最小生成树(Prim,Kruskal 算法),拓扑排序 AOV,关键路径 AOE
- 拓扑排序
- 拓扑排序
- 洛谷P1113 杂务(拓扑排序)
- 洛谷P2149 [SDOI2009]Elaxia的路线(最短路,拓扑排序)
- 【BZOJ4562】【拓扑排序】【DP】[Haoi2016]食物链 题解
- 例题6 - 19 uva1572 Self-Assembly 拓扑排序
- HDU 5638 Toposort 拓扑排序 优先队列
- topological-sort(拓扑排序)
- codeforce 825E. Minimal Labels 拓扑排序 贪心思想
- 【笔记】AOV网与拓扑排序
- 第七章 图(拓扑排序与关键路径)
- bzoj5017 [Snoi2017]炸弹 线段树优化建图+Tarjan+拓扑排序
- 拓扑排序-java实现
- 数据结构之图(六)——拓扑排序
- POJ - 3687 Labeling Balls (拓扑排序)