算法与数据结构基础9 C++实现有向图——邻接矩阵存储

本文介绍了使用C++实现有向图的邻接矩阵存储方式,强调了邻接矩阵在存储和理解上的便利性。邻接矩阵通过二维数组表示图中节点之间的连接,对于存在边的节点,数组元素设为1(无权图)或相应的权值(有权图),反之设为0。文章讨论了邻接矩阵在稠密图中的优势,指出其空间复杂度为O(V^2)。另外,还提及邻接表更适合稀疏图的情况。
摘要由CSDN通过智能技术生成
               

邻接矩阵的存储比邻接表实现起来更加方便,也更加容易理解。

邻接矩阵就是用一个二维数组matrix来存储每两个点的关系。如果两个点m,n之间有边,将数组matrix[]m[m]设为1,否则设为0。

如果有权,则将matrix[m]n[]设为权值,定义一个很大或者很小的数(只要不跟权值冲突即可),表示不相连。

空间复杂度为O(V^2),适合比较稠密的图。

邻接表O(V+E),适合比较稀疏的图。


//GraphMatrix.h

#include <iostream>#include <cstdio>#include <iomanip>      // std::setw#define  NO_EDGE (-1)using namespace std;// 有向图class GraphMatrix{public: ~GraphMatrix(); void createGraph()void printGraph();private// 1. 输入定点数 void inputVertexCount()// 2. 生成定点数组 void makeVertexArray()// 3. 输入边数 void inputEdgeCount()// 4. 输入边的起始点 void inputEdgeInfo()// 5. 添加边节点至对应的链表中 void addEdgeToList(int vFrom, int weight, int vTo);privateint m_vCount; int m_eCount; int** m_vVertex;};GraphMatrix::~GraphMatrix(){ for (int i = 0; i < m_vCount; ++i){  delete m_vVertex[i]; } delete[] m_vVertex;}void GraphMatrix::inputVertexCount(){ cout << "please input count of vertex:"cin >> m_vCount;}void GraphMatrix::makeVertexArray(){ m_vVertex = new int*[m_vCount]; for (int i = 0; i < m_vCount; ++i){  m_vVertex[i] = new int[m_vCount]; } for (int i = 0; i < m_vCount; ++i){  for (int j = 0; j < m_vCount; ++j){   m_vVertex[i][j] = NO_EDGE;  } }}void GraphMatrix::inputEdgeCount(){ cout << "please input count of edge:"cin >> m_eCount;}void GraphMatrix::inputEdgeInfo(){ cout << "please input edge information:" << endlfor (int i = 0; i < m_eCount; ++i){  cout << "the edge " << i << ":" << endl;  // 起点  int from = 0;  cout << "From: ";  cin >> from;  // 权值  int weight = 0;  cout << "Weight:";  cin >> weight;  // 终点  int to = 0;  cout << "To: ";  cin >> to;  cout << endl;  addEdgeToList(from, weight, to); }}void GraphMatrix::addEdgeToList(int vFrom, int weight, int vTo){ m_vVertex[vFrom][vTo] = weight;}void GraphMatrix::printGraph(){ for (int i = 0; i < m_vCount; ++i){  for (int j = 0; j < m_vCount; ++j){   cout << setw(3) << m_vVertex[i][j] << " ";  }  cout << endl; }}// **************************************************************************// 流程控制// **************************************************************************void GraphMatrix::createGraph(){ inputVertexCount(); makeVertexArray(); inputEdgeCount(); inputEdgeInfo();}

// main.cpp

// test for GraphMartrix#include "GraphMatrix.h"#include <cstdlib> int main(){ GraphMatrix graph; graph.createGraph(); graph.printGraph(); system("pause"); return 0;}

假如有图如下



运行结果截图:




           
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值