【无标题】

广度优先 (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为空时,拓扑排序完成。

总体而言,拓扑排序算法的作用是对有向无环图中的顶点进行排序,使得所有的边都从前面的顶点指向后面的顶点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值