广度优先 (Breadth First Search)
void BFS(Graph* G, int start,Queue<int>*Q) {//start为出发的顶点
int v, w;
Q->enqueue(start); // Initialize Q
G->setMark(start, VISITED);
while (Q->length() != 0) { // Process Q
v=Q->dequeue(); PreVisit(G, v); // Take action
for(w=G->first(v);w<G->n();w=G->next(v,w))
if (G->getMark(w) == UNVISITED) {
G->setMark(w, VISITED); Q->enqueue(w); }
PostVisit(G,v); }
}
队列在该算法中的作用是用于存储待访问的顶点。具体来说,起始点start被加入队列后,每次从队列中取出队首元素v进行访问后,v的未被访问的邻居顶点会被依次加入队列中,等待后续的访问。
图应用问题
拓扑排序
定义 AOV网——用顶点表示活动,用弧表示活动间优先关系的有向图称为顶点表示活动的网(Activity On Vertex network),简称AOV网 若<vi,vj>是图中有向边,则vi是vj的直接前驱;vj是vi的直接后继 AOV网中不允许有回路,这意味着某项活动以自己为先决条件.
拓扑排序——把AOV网络中各顶点按照它们相互之间的优 先关系排列成一个线性序列的过程叫拓扑排序
检测AOV网中是否存在环方法:对有向图构造其顶点的 拓扑有序序列,若网中所有顶点都在它的拓扑有序序列 中,则该AOV网必定不存在环
拓扑排序的方法:在有向图中选一个没有前驱的顶点(入度为0)且输出之 ,从图中删除该顶点和所有以它为尾的弧 ,重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止
基于队列的拓扑排序算法实现
void topsort(Graph* G, Queue<int>* Q) {
int Count[G->n()];//顶点的入度数组
int v, w;
for (v=0; v<G->n(); v++) Count[v] = 0;
for (v=0; v<G->n(); v++) // Process edges
for (w=G->first(v); w<G->n();w = G->next(v,w))
Count[w]++; // Add to v2's count
for (v=0; v<G->n(); v++) // Initialize Q
if (Count[v] == 0) // 入度为0,No prereqs
Q->enqueue(v);
while (Q->length() != 0) {
Q->dequeue(v);
printout(v); // PreVisit for V
for (w=G->first(v); w<G->n();w = G->next(v,w)) {
Count[w]--; // One less prereq
if (Count[w] == 0) // Now free
Q->enqueue(w);
}}}
该函数实现了拓扑排序算法,其中参数包括一个指向图对象的指针G和一个指向队列对象的指针Q。
首先,该函数创建一个大小为G的顶点数的数组Count,用于存储每个顶点的入度。然后,对于每个顶点v,它通过遍历所有与之相邻的顶点w来计算w的入度,最终将其保存在Count数组中。
接下来,该函数遍历Count数组中的每个顶点v,如果该顶点的入度为0,则将其加入队列Q中。然后,它进入一个循环,不断地从队列中取出顶点v并输出,对于每个与v相邻的顶点w,它将w的入度减1,如果减1后w的入度为0,则将w加入队列Q中。直到队列Q为空时,拓扑排序完成。
总体而言,拓扑排序算法的作用是对有向无环图中的顶点进行排序,使得所有的边都从前面的顶点指向后面的顶点。