1. 程式人生 > >C++圖的鄰接矩陣表示法

C++圖的鄰接矩陣表示法

程式碼如下:

const int DefaultVertices = 100;
const int maxWeight = 1000;
template <class T, class E>
class Graphmtx
{
    friend istream& operator >> (istream& in, Graphmtx<T, E>&	G);//輸入
    friend ostream& operator << (ostream& out, Graphmtx<T, E>& G);//輸出

private:
    int maxVertices;//最大頂點個數
    int numEdges;//當前邊數
    int numVertices;//當前頂點數
    int getVertexPos(T vertex)
    {

        for(int i = 0; i < numVertices; i++)
        {
            if(VerticesList[i]==vertex)return i;
        }
        return -1;
    }
    ;//給出頂點vertex在圖中的位置
    T *VerticesList;//頂點表
    E **Edge;//鄰接矩陣
public:
    Graphmtx(int sz = DefaultVertices);//構造方法
    ~Graphmtx()
    {
        delete []VerticesList;    //析構方法
        delete[]Edge;
    }
    T getValue(int i)
    {
        return i>=0&&i<=numVertices? VerticesList[i]:NULL;
    }//取頂點i的值

    E getWeight(int v1, int v2)//返回邊(v1,v2)上的權值
    {
        return v1!=-1&&v2!=-1 ? Edge[v1][v2]:NULL;
    }

    int getFirstNeighbor(int v);//取頂點v的第一個鄰接頂點
    int getNextNeighbor(int v, int w);
    bool insertVertex(const T& vertex);//插入頂點vertex
    bool insertEdge(int v1, int v2, E cost);//插入邊(v1,v2),權值為cost
    bool removeVertex(int v);//刪除頂點v和所有與他相關的邊
    bool removeEdge(int v1, int v2);//刪除邊(v1, v2)
};

template <class T, class E>
Graphmtx<T,E>::Graphmtx(int sz){
//建構函式
maxVertices = sz;
numEdges = 0;
numVertices = 0;
int i, j;
VerticesList = new T[maxVertices];
Edge = (E**)new E*[maxVertices];
for(i = 0; i < maxVertices; i++){

      Edge[i] = new E*[maxVertices];
}

for(i = 0; i < maxVertices; i++){
for(j = 0; j < maxVertices; j++){
      Edge[i][j] = (i == j)? 0: maxWeight;
}
}
}

//用鄰接矩陣表示的圖的存取操作的實現
template <class T, class E>
int Graphmtx<T, E>::getFirstNeighbor(int v){
if(v!=-1){
      for(int col = 0; col < numVertices; col++){
            if(Edge[v][col]>0 && Edge[v][col]<maxWeight)return col;
      }
      return -1;
}
};

template <class T, class E>
int Graphmtx<T, E>::getNextNeighbor(int v, int w){
if(v!=-1&&w!=-1){
      for(int col = w + 1; col < numVertices; col++){
            if(Edge[v][col]>0&&Edge[v][col]<maxWeight){
                  return col;
            }
            return -1;
      }
}
}
//插入頂點
template <class T, class E>
bool Graphmtx<T, E>::insertVertex(const T& vertex){
if(numVertices==maxVertices)return false;
VerticesList[numVertices+1] = vertex;
return true;
}
//刪除頂點,要刪除所有與頂點v有關的邊
//這個函式還是非常好的
template <class T, class E>
bool Graphmtx<T, E>::removeVertex(int v){
      if(v<0||v>numVertices)return false;
      if(numVertices == 1)return false;

VerticesList[v] = VerticesList[numVertices-1];
for(int i = 0; i < maxVertices; i++){
      if((Edge[i][v]>0&&Edge[i][v]<maxWeight)||(Edge[v][i]>0&&Edge[v][i]<maxWeight))numEdges--;
}

for(int i = 0; i < numVertices; i++){
            Edge[i][v] = Edge[i][numVertices-1];
}
numVertices--;
for(int i = 0; i < numVertices; i++){
            Edge[v][i] = Edge[numVertices][i];
}
return true;
}

//插入邊
template <class T, class E>
bool Graphmtx<T, E>::insertEdge(int v1, int v2, E cost){
if(v1>=0&&v1<numVertices&&v2>=0&&v2<numVertices&&Edge[v1][v2]!=maxWeight){
      Edge[v1][v2]=Edge[v2][v1]=cost;
      numEdges++;//記得邊的數量是要加上1
      return true;
}
else return false;
}

//刪除邊
template <class T, class E>
bool Graphmtx<T, E>::removeEdge(int v1, int v2){
if(v1>=0&&v1<numVertices&&v2>=0&&v2<numVertices&&Edge[v1][v2]>0&&Edge[v1][v2]<maxWeight){
      Edge[v1][v2]=Edge[v2][v1]=maxWeight;
      numEdges--;
      return true;
}
else return false;
}

//輸入
template <class T, class E>
istream& operator>>(istream& in, Graphmtx<T,E>& G){
int i, j, k, n, m;
T e1, e2;
E weight;
in>>n>>m;
for(i = 0; i < n; i++){
      in>>e1;
      G.insertVertex(e1);
}
i = 0;
while(i<m){
      in>>e1>>e2>>weight;
      j = G.getVertexPos(e1);k=G.getVertexPos(e2);
      if(j==-1||k==-1)
            cout<<"邊兩端頂點資訊有誤,請重新輸入"<<endl;
      else{
            G.insertEdge(j, k, weight);i++;
      }
}
return in;
}

//輸出
template <class T, class E>
ostream& operator>>(ostream& out, Graphmtx<T,E>& G){
int i, j, n, m;
T e1, e2;
E w;
n = G.NumberOfVertices();
m = G.NumberOfEdges();
out<<n<<","<<m<<endl;
for(i = 0; i < n; i++){
      for(j = i + 1; j < n; j++){
            w=G.getWeight(i, j);
            if(w>0&&w<maxWeight){
                  e1 = G.getValue(i);
                  e2 = G.getValue(j);
                  out<<"("<<e1<<","<<e2<<","<<w<<"("<<endl;
            }
      }
}
return out;
}


相關推薦

C++鄰接矩陣表示

程式碼如下: const int DefaultVertices = 100; const int maxWeight = 1000; template <class T, class E> class Graphmtx { friend istream

【資料結構】鄰接矩陣表示的深度廣度優先遍歷遞迴和非遞迴遍歷

假設有以下結構的圖: 用鄰接矩陣表示如下: 因為他是無向圖,我們可以發現他的矩陣是對角對稱的。矩陣中每一行每一列都可以看成是一個頂點,矩陣中的元素表示著該頂點與其他頂點的關係,當元素的值為1說明它與對應列的頂點有邊相連,如果他們的值為0,表示他們沒有邊相

看資料結構寫程式碼(35) 鄰接矩陣表示

雜談:最近清明小長假,好好的放鬆了一下。節前 和 節後 都有點 鬆懈。不好,不好。貴在堅持。加油。 圖的鄰接矩陣表示法是用 兩個陣列 來表示 圖的資料結構。一個是頂點陣列,另一個是鄰接矩陣陣列。鄰接矩陣 裡存放著 頂點的關係。 用鄰接矩陣表示圖,在 看 頂點之間 是否有邊,

詳解資料結構——鄰接矩陣表示

一、圖的建立 圖是表達“多對多”的關係的一種資料結構。 它由非空的有限頂點集合和有限邊集合組成。 1. 頂點集合常常由陣列表示。 陣列下標表示頂點位置。 陣列內容包含頂點資料,並且要新增判定是否被訪問過的標誌標量,為其餘操作提供引數。 其資料型別定義如下: struct

表示和實現1(矩陣表示

鄰接矩陣: 鄰接矩陣是用矩陣來表示頂點之間的相鄰關係的一種方法。A[i,j]=1則是圖的邊。若A[i,j]=0,則不是圖的邊。若G是網路則A[i,j] = wij;   wij表示邊上的權值,若A[i,j]=0或無窮則計算機允許的大於所有邊上權值的數。 鄰接矩陣表示帶權圖類

鄰接矩陣鄰接表示

圖的鄰接矩陣表示法  #define MaxVertexNum 100 /* 最大頂點數設為100 */ #define INFINITY 65535 /* ∞設為雙位元組無符號整數的最大值65535*/ typedef int Vertex;

C++ 鄰接矩陣表示以及深度優先和廣度優先遍歷

Node.h 宣告頂點類 #pragma once class Node { public: Node(char data=0); char m_cData; bool m_bIsVisited; }; Node.cpp 實現頂點的成員以及操作函式 #incl

相關(一)鄰接矩陣表示C++)及的遍歷

一.圖的鄰接矩陣表示法 struct graph { vector<vector<int>> cost;//鄰接矩陣 vector<string> vertex;//頂點的值,用string較好,節點的名字可以是v1,v

鄰接矩陣表示c++

#include<iostream> #include<queue> using namespace std; enum graphtype { undigraph, digraph, undinetwork, dinetwork };//列舉 template<

相關(四)鄰接矩陣表示C++)-拓撲排序

一.測試用圖 二.拓撲排序 void toposort(graph g) {//注意,拓撲排序中要把鄰接矩陣中沒有邊的位置置為0(為了統計入度) size_t N = g.cost.size(); vector<int> InDegree(N, 0);//統

相關(三)鄰接矩陣表示C++)及最最小生成樹演算法(prim和kruskal)

一.測試用圖 鄰接矩陣表示: //prim注意是無向圖 vector<vector<int>> p(6, vector<int>(6, INF));//類似dijikstra,沒有邊的點設為INF p[0][1] = 10;

相關(二)鄰接矩陣表示C++)及最短路徑演算法

一.Dijikstra演算法 注意:計算最短路徑時,需要把鄰接矩陣中沒有邊的位置初始化為無窮大;此處以INF表示,INF可以取0x3f3f3f3f,不能直接設為INT_MAX(因為做加法時會上溢)。 測試用圖: 其鄰接矩陣表示為: vector<vector<int

C++ 鄰接錶轉鄰接矩陣表示

#include <bits/stdc++.h> #define MaxSize 100 /* * Created by HarvestWu on 2018/07/20. */ using namespace std; typedef int ElemType; //鄰接矩陣頂點

的陣列表示鄰接矩陣)與Prim演算法

普里姆(Prim)演算法與最小生成樹 最小生成樹(MST) 對於連通網(帶權圖),選擇生成樹的總代價最少(Minimum Spanning Tree,MST ),比如一個N個城市之間的通訊網,網的頂點代表城市,邊代表這條路的修路費。那麼這樣就設計一個最小

鄰接表示C語言)

鄰接表 鄰接表資料結構型別如下: #define MaxVertices 100 typedef struct node{ //邊表 int adjvex; node*

(有向,無向)的鄰接矩陣表示C++實現(遍歷,拓撲排序,最短路徑,最小生成樹) Implement of digraph and undigraph using adjacency matrix

本文實現了有向圖,無向圖的鄰接矩陣表示,並且實現了從建立到銷燬圖的各種操作。 以及兩種圖的深度優先遍歷,廣度優先遍歷,Dijkstra最短路徑演算法,Prim最小生成樹演算法,有向圖的拓撲排序演算法。 通過一個全域性變數控制當前圖為有向圖還是無向圖。 若為無向圖,則生成的

鄰接矩陣表示

兩種 http down leetcode img mas gen eat cnblogs 圖常用兩種方式表示,鄰接矩陣、鄰接表。 0、結構初始化 struct GraphNode { int Nv; /* 頂點數 */ int

資料結構--C語言-鄰接矩陣-的遍歷

資料結構-圖-C語言-鄰接矩陣-圖的遍歷 bool visited[999]; void visit(Vertex V) { printf("正在訪問頂點%d\n", V); } bool isEdge(MGraph graph, Vertex v, Vertex w) { re

C++資料結構 21 -鄰接矩陣

#include <iostream> #define MAX_VERTS 20 using namespace std; /**使用鄰接矩陣來表示一個圖**/ class Vertex { public: Vertex(char lab){Label=lab;}

六、C++實現(鄰接矩陣)資料結構

本文旨採用C++實現圖資料結構,具體地以鄰接矩陣的方式實現圖資料結構。圖結構可以描述一組物件之間的二元關係,例如在城市交通中,聯接於各個公交車站之間的道侶,或者在網際網路中個網路節點之間的路由都可以很方便地用圖結構來表述,另外在之前介紹的樹結構也屬於圖的一種,此類一般性的二元關係,屬於圖論。