摘要:在一个无权图中,寻找某个节点到其它所有节点的最短路径.
基本思路:(1)首先找到与起始节点相邻接的所有节点,那么它们的最短路径就是1.并且将这些访问过的节点标志为已经访问.容易知道,其余所有没有访问的节点中存在的最短路径是2.而且这些节点都是第一批访问的节点的邻接节点…..,如果最短路径为k的节点已经被访问,那么剩下节点中最短路径就是K+1,而且一定由路径长是k的节点连接到它们的。这很容易证明.
(2)我们选用队列来实现这个算法,因为如果简单的使用数组,效率比较低下.
首先选中起始节点,将它相邻的节点都放入队列中,并且标记最短路径长度为1。然后从队列逐个将节点出队,检测每一个出队节点的相邻节点,如果该节点的尚未被更新,入队并且在原来的最短路径上+1,否则检测下一个节点.直到队列为空.
注意,本段代码的头文件已经包含了关于队列的ADT
#include "stdafx.h"
#include "图论基本ADT.h"
typedef struct TableRecord Table[Number];
#define Infinity 10000
struct TableRecord
{
bool known;
int distance;
int path;
};
void Initable(Table T,int s)
{
int i;
for(i=0;i<=Number-1;i++)
{
T[i].distance = Infinity;
T[i].known = false;
}
T[s].distance = 0;
T[s].known = true;
T[s].path = s;
}
void unweighedsearch(Table T,Graph G,int s)
{
//无权重
int v;
queue Q = Create(Number);
Enqueue(Q,s);
while(Q->size!=0)
{
v = Dequeue(Q);
G[v] = G[v]->Next;
//遍历该节点(v/d = k)的邻接节点(d = k+1)
while(G[v]!=NULL)
{
s = G[v]->Element;//s为v的邻接节点编号
if(T[s].distance == Infinity)
{
T[s].distance = T[v].distance + 1;
T[s].known = true;
Enqueue(Q,s);
T[s].path = v;
}
G[v] = G[v]->Next;
}
}
}