算法导论:c++实现图

图的表示

这里写图片描述

这里写图片描述

这里写图片描述

这里用结构体来表示图G,和图顶点GraphNode,后面要用到的顶点颜色用枚举类型表示

enum color
{
    white = 0,
    gray,
    black
};
struct graphNode {
    char name;  //顶点名
    struct graphNode *pre;  //前驱节点
    int d; //深度
    color c; //节点颜色
    graphNode(char n):name(n),pre(NULL),c(white),d(0) {}
};
struct graph {
    vector<graphNode *> v;  //顶点集合
    map<char, list<graphNode *>> adj; //邻接链表,方便用顶点查找
};

这里写图片描述

广度优先搜索

这里写图片描述
伪代码
这里写图片描述

书上的示例图解
这里写图片描述

根据书上的伪代码编写广度优先程序

graph BFS(graph G, graphNode *s)
{
    s->c = gray;
    s->d = 0;
    deque<graphNode*> q; //创建一个双端队列
    q.push_back(s);
    while (!q.empty())
    {
        graphNode *cur = q.front();
        q.pop_front();
        char n = cur->name;
        for (graphNode *u : G.adj[n]) //遍历当前顶点的邻接链表
        {
            if (u->c == white) {
                u->c = gray;
                u->d = cur->d+1;    //顶点深度为当前顶点深度加1
                u->pre = cur; //前驱为当前顶点
                q.push_back(u); //入队
            }
        }
        cur->c = black;
    }
    return G;
}

图的初始化由上图示例初始:

graph initGraph() {
    graph G;
    G.v = {new graphNode('r'),new graphNode('v'),new graphNode('s'),new graphNode('w'),
        new graphNode('t'),new graphNode('x'),new graphNode('u'),new graphNode('y') };
    //初始化邻接链表
    G.adj['r'] = { G.v[1],G.v[2] };
    G.adj['s'] = { G.v[3],G.v[0] };
    G.adj['w'] = { G.v[2],G.v[4],G.v[5] };
    G.adj['t'] = { G.v[5],G.v[1],G.v[6] };
    G.adj['x'] = { G.v[4],G.v[3],G.v[6],G.v[7] };
    G.adj['u'] = { G.v[4],G.v[5],G.v[7] };
    G.adj['y'] = { G.v[5],G.v[6] };
    G.adj['v'] = { G.v[0]};
    return G;
}

调用:

int main()
{
    graph G = initGraph();
    BFS(G,G.v[2]);
}

打印最短路径

//打印路径
void printPath(graph G, graphNode *s, graphNode *v) {
    if (s == v) {
        cout << s->name;
    }
    else if (v->pre == NULL) {
        cout << "no path!";
    }
    else {
        printPath(G, s, v->pre);
        cout << v->name;
    }
}

调用:

int main()
{
    graph G = initGraph();
    G=BFS(G,G.v[2]);
    printPath(G, G.v[2], G.v[6]);
}

输出:

swtu

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值