c++ 实现用邻接表和邻接矩阵来存储图

这里借助了c++的容器vector来存储每一个结点以及信息
这里我们的稀疏图用邻接表来存储会更好一点
稠密图的话用邻接矩阵来存储会更好一点

稠密图的邻接矩阵的实现

#ifndef DENSEGRAPH_MY_H_
#define DENSEGRAPH_MY_H_

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

using namespace std;

//用邻接表实现存储稠密图

class DenseGraph_my
{
private:
	int n,m; //n表示有多少节点 m表示有多少边
	bool directed; //写一个可扩展的图,这样可以接受有向图也可以接收无向图
	vector< vector<bool> > g; //邻接矩阵存储 ,这里面类型是bool 了不是int哦

public:
	DenseGraph_my(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_my()
	{

	}

	int V() {return n;} //返回有多少个顶点
	int E() {return m;} //返回有多少个边

	//判断两个节点是否有边
	bool hasEdge(int v, int w)
	{
		assert(v >= 0 && v < n);
		assert(v >= 0 && v < n);

		return g[v][w]; //直接返回这一点的值就行啦
	}


	//给相应的两个点加上边
	void addEdge( int v ,int w)
	{
		assert(v >= 0 && v < n);
		assert(v >= 0 && v < n);

		if(hasEdge(v,w))
			return ;

		g[v][w] = true;

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

		m++;
	}


	void show()
	{
		for(int i = 0 ; i < n ; i ++)
		{
			for( int j = 0 ; j <  n ; j ++)
				cout << g[i][j] << "\t";
			cout << endl;
		}
	}

};



#endif

稀疏图的邻接表的实现

#ifndef SPARSEGRAPH_MY_H_
#define SPARSEGRAPH_MY_H_

//稀疏图用邻接表来存储
//邻接表竟然也是用vector容器来实现的

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

using namespace std;

class SparseGraph_my
{
private:
	int n, m ;//n是节点数 m是边数
	bool directed; //判断是否是有向图
	vector< vector<int> > g; //这里直接存的就是数值了,而不是true和false


public:
	SparseGraph_my(int n, bool directed)
	{
		this->n = n;
		this->m = 0;
		this->directed = directed;
		for(int i = 0 ; i < n ; i++)
			g.push_back(vector<int>()); //这里直接就不赋值,每一个都是空的
	}

	~SparseGraph_my()
	{

	}

	int V(){ return n;}
	int E(){ return 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;
	}

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

		g[v].push_back(w); //直接在v所在的那一个链表中添加上w的元素
		if( v != w && !directed)
			g[w].push_back(v);

		m++;

	}

	void show()
	{
		for(int i = 0 ; i < n ; i++)
		{
			cout << "vertex " << i << ":\t";
			for(int j = 0 ; j < g[i].size(); j++)
				cout << g[i][j] << "\t";
			cout << endl;
		}
	}



};


#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五月的天气

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值