第二次修改:时间2020年9月29日21点52分,对于该算法中某些不讲人话的定理的证明用通俗易懂的话再次说明了一遍。
算法消耗时间分析:
void BFS(PtrToGraph G, PtrToNode S, Queue Q)
{
Vertex B;
PtrToNode P = (PtrToNode)malloc(sizeof(struct Node));
PtrToNode R = (PtrToNode)malloc(sizeof(struct Node));
for (int i = 0; i < MaxVertexNum; i++)
{
G->A[i].color = WHITE;
G->A[i].d = INT_MAX;
G->A[i].Parent = NIL;
}
S->color = GRAY;
S->d = 0;
S->Parent = NIL;
MakeEmpty(Q);
Enqueue(S->V, Q);
while (!IsEmpty(Q))
{
B = FrontAndDeQueue(Q);
*P = G->A[B];
for (R = P->Next; R != NULL; R = R->Next)
{
if (R->color = WHITE)//直到所有能够到达的节点中均没有白色的时候,就不会有入队的节点了
{
R->color = GRAY;
R->d = P->d + 1;
R->Parent = P->V;
Enqueue(R->V,Q);
}
}
P->color = BLACK;
}
在该算法中,可以看到对于含有N个节点的图来说,其中每一个点都会进行一次入队以及出队的过程。而入队和出队所需要的时间均为O(1),则对队列进行操作的时间为O(2N)=O(N),同时再考虑除了队列之外的操作所需要的时间。
在初始化的过程中,对所有节点的初始化由一次 for 循环中的3个耗时O(1)的语句构成,那么初始化需要的时间为O(3N) = O(N),同时,再对边进行分析,对于边进行的操作有:扫描每一个节点的邻接链表,即扫描对与该顶点通过边相连的所有顶点,那么在无向图中,该扫描所