1——2:略
3. 使用单个位来表示颜色,单个位只能表示位0/1,因此颜色只有白和灰,黑色无法表示,因此删除第十八行对每个结点扫描结束后赋值为黑色的一行代码。
证明:直接一想就可以,代码第十三行,v.color==WHITE才会进行处理,灰色同样不处理,而算法最后之所以设置为黑色,是为了在研究算法的过程中给出一个更加形象的说明而已。
4. 如果换成邻接矩阵的话,BFS的时间复杂度将变为多少
如果换成邻接矩阵,在扫描队列中结点i的时候,必须将mat(i,-)这一行所有的结点都扫描1遍,复杂度为O(V),而扫描队列中每个结点,因此复杂度为O(V^2)。
5. 证明:在广度优先算法里,赋给结点u的u.d值与结点在邻接链表里出现的次序无关。使用下图为例子,证明:BFS所计算出来广度优先树可以因邻接链表中的次序不同而不同。
证明:①即使在邻接链表出现的次序不同,根据广度优先搜索的算法,这些结点的u.d值都是u.pai.d+1(pai一概表示为先驱结点),因此与次序无关。
②广度优先树也是前驱子图。读者可行根据上图进行证明,过于简单不再细细解释,提示:t,x在链表中的不同顺序可能会导致生成两种不同的树。
6. 请你举出一个图和一个树边的例子,图中源点到某一点的最短路径也是树边中的一条简单路径,但是无论在邻接链表中结点的顺序怎么排列,都无法通过BFS找到这树边。
就这样一个图,无论2,5在结点1中的顺序如果,都无法找到以下树边:
因为在BFS中,3,4总会连在同一个结点上。
7. 根据时间复杂度为O(n+r)很明显可以看出这是一个BFS的应用,对BFS稍加修改就可以对链表进行处理分出娃娃脸型和高跟鞋型。
8. 给出一个有效算法来求树的直径,树的直径就是树的所有最短路径中的最大值。
宽度优先搜索算法恰好可以求最短路径,从树的根节点s开始运行BFS(G,s),找出最后一个结点u,然后再运行以此BFS算法BFS(G,u),这次找到宽度优先搜索的最后一个结点v的v.d值就是树的直径。时间复杂度等同于BFS为O(V+E),在官方给出的答案中这里的时间复杂度为O(V),因为在树中边的数量和结点的数量是相关的(|E| = |V|-1),因此此处的时间复杂度进一步简化可以简化到O(V)。
9. G为一个连通无向图,给出一个算法在O(V+E)时间内计算图G中这样一个路径:该路径正反通过E中每条边恰好正反一次。
图G为一个无向图,找一个路径正好正反通过E中每条边,这个很像一个欧拉回路的问题。也类似与用BFS生成一个树。
Make_Path(u){
从u开始,如果G中存在u——v的路径并且v不在树中,则创建一个到v再返回u的环,这时候相当于设置v.pai = u;
然后遍历每个u——v的v,如果v不等于u.pai,则创建一条到v的路径并执行Make_Path(v);
算法最后执行路径回到u.pai;
}
举个例子: