1.拓扑排序
(1)举个例子,要学习某些课程必须先学过一些课程
用图把这个东东描述出来就变成:
那么,问题来啦,是否可以找到一个序列,使得这个序列上的所有课程都满足:先修课程在后修的课程前面?这样的序列就是拓扑序列.....
(2)怎么求拓扑序列?
简单的说是不断去掉没有前驱的点,得到的这些点就是拓扑序列;
还是上面的例子:
step1:9没有前驱,去掉(和它相关的边也去掉);
step2:这时候有8,6,4,三个点没有前驱,随便选一个去掉(这个以随便就说明拓扑序列不唯一喔~)
......(下面,你懂的~)
(3)算法
要用到没有前驱所以要图的入度;
上面的模拟过程知道实际上是BFS:
a.建立入度为零的顶点排队
b.扫描顶点表,将入度为0的顶点入队;
c.while(排队不空)
{
输出队头结点;
记下输出结点的数目;
删去与之关联的出边;
若有入度为0的结点,入队
}
d.若输出结点个数小于总的顶点个数,则输出有环路;
(4)象征性的贴一小段代码:
void topsort(Adgraph* G)
{
queue<int> Q;
int x,count=0;
for(int i=1; i<=G->n; i++)
if(G->Ad[i].indegree==0) Q.push(i);//入度为0的顶点入