数据结构与算法C++之图的表示

图的表示:邻接矩阵、邻接表

邻接矩阵表示无向图
在这里插入图片描述
邻接矩阵表示有向图
在这里插入图片描述
邻接表表示无向图
在这里插入图片描述
邻接表表示有向图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下面程序实现了一个稀疏图和一个稠密图

稠密图程序为

#include <iostream>
#include <cassert>
#include <vector>

// 稠密图 - 邻接矩阵
class DenseGraph {

private:
    int n;
    int m;
    bool directed;
    vector<vector<bool>> g;

public:
    DenseGraph( int n, bool directed ){
        this->n = n;
        this->m = 0;
        this->directed = directed;
        for (int i = 0; i < n; i++){
            g.push_back( vector<bool>(n,false) );
        }
    }
    ~DenseGraph{

    }

    int V(){return n;}
    int E(){return m;}

    void addEdge(int v, int w ){
        assert( v >= 0 && v < n );
        assert( w >= 0 && w < n );

        if ( hasEdge(v, w) )
            return;
        g[v][w] = true;
        if ( !directed )
            g[w][v] = true;

        m++;
    }

    bool hasEdge(int v, int w){
        assert( v >= 0 && v < n );
        assert( w >= 0 && w < n );
        return g[v][w];
    }
};

稀疏图为

#include <iostream>
#include <vector>
#include <cassert>

using namespace std;

//稀疏图 - 邻接表
class SparseGraph{

private:
    int n, m;
    bool directed;
    vector<vector<int>> g;

public:
    SparseGraph( int n, bool directed ){
        this->n = n;
        this->m = 0;
        this->directed = false;
        for ( int i = 0; i < n; i++ ){
            g.push_back(vector<int>());
        }
    }

    ~SparseGraph{

    }

    int V(){return n;}
    int E(){return m;}

    void addEdge(int v, int w){
        assert( v >= 0 && v < n );
        assert( w >= 0 && w < n );

        g[v].push_back(w);
        if ( v != w && !directed )
            g[w].push_back(v);

        m++;
    }

    bool hasEdge(int v, int w){
        assert( v >= 0 && v < n );
        assert( w >= 0 && w < n );
        for (int i = 0; i < g[v].size(); i++){
            if ( g[v][i] == w )
                return true;
        }
        return false;
    }
};
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值