图——拓扑排序
拓扑排序
AOV网,描述了一种有实际意义的过程,所以结点之间有了先后顺序,其次是结点之间是没有环的。
如何导出正确的结点之间的顺序,就需要拓扑排序。三个步骤:
用邻接表来存储图,且修改顶点结构体为
1 | typedef struct |
拓扑排序的代码实现:
int TopSort(AGraph *G)
{
int i ,j ,n=0; //n统计当前已经输出的顶点个数
int stack[maxSize],top=-1; //定义一个栈,保存所有入度为0的顶点
ArcNode* p; //遍历
for(i=0;i<G->n;++i)
if(G->adjList[i].count==0)
stack[++top]=i; //将入度为0的压栈
while(top!=-1)//若栈不为0,
{
i=stack[top--]; //取出顶点,等效于将这个顶点删除,
++n; //记录取出的点的个数,
std::cout<<i<<" "; //输出这个顶点
p=G->adjList[i].first; //遍历刚才出栈顶点的所有边,
while(p!=NULL)
{
j=p->adjV; //通过这些边找到其相邻顶点,
--(G->adjList[j].count); //修改其count
if(G->adjList[j].count==0) //然后将count为0的点入栈,以待输出
stack[++top]=j;
p=p->next;
}
}
if(n==G->n) //输出的顶点个数是否为图中顶点的个数
return 1; //相等则拓扑排序完成
else
return 0;
}```
**逆拓扑排序**
<img src="https://github.com/fanandli/picblog/blob/master/nituopupaixu.png?raw=true" width = "600" height = "350" alt="tuopu1" align=center />
如何用深度优先遍历实现逆拓扑排序
深度优先遍历:
<img src="https://github.com/fanandli/picblog/blob/master/shenduyouxianbianli.png?raw=true" width = "600" height = "350" alt="tuopu2" align=center />
以此实现逆拓扑排序:
<img src="https://github.com/fanandli/picblog/blob/master/tuopupaixushixian.png?raw=true" width = "600" height = "350" alt="tuopu3" align=center />