演算法與資料結構基礎9:C++實現有向圖——鄰接矩陣儲存
阿新 • • 發佈:2019-02-18
鄰接矩陣的儲存比鄰接表實現起來更加方便,也更加容易理解。
鄰接矩陣就是用一個二維陣列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); private: int 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:" << endl; for (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;
}
假如有圖如下
執行結果截圖: