对于无权边的最短路径搜索

摘要:在一个无权图中,寻找某个节点到其它所有节点的最短路径.
基本思路:(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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值