1. 程式人生 > >資料結構 圖的鄰接矩陣

資料結構 圖的鄰接矩陣

圖的鄰接矩陣的儲存方式是用兩個陣列來實現的,一個一維陣列儲存頂點資訊,一個二維陣列儲存線(無向圖)或弧(有向圖)的資訊。

設圖G有n個頂點,則鄰接矩陣是一個n × n的方陣,定義為:

無向圖的鄰接矩陣,兩個頂點有邊則為1,否則,為0;因為是無向圖arc[i][j] = arc[j][i],所以矩陣為對稱矩陣,對角線為自己到自己的邊,鄰接矩陣中,行之和或者列之和都為各頂點度的總數。

設圖G有是網圖,有n個頂點,則鄰接矩陣是一個n × n的方陣,定義為:



無向網圖和無向圖差不多,就是加了權值,兩個頂點之間無邊的話距離是∞。

如果是有向圖,鄰接矩陣就不是對稱矩陣了。

下面是鄰接矩陣的儲存結構:

#define MAXVERTEX 100   //圖的最大頂點數
#define INFINITY 32767  //用有符號的int最大值表示無窮大
typedef char vertextype;    //定義定點的儲存資訊為字元型
typedef int arctype;    //定義邊的權值為int型

//圖的鄰接矩陣的儲存結構
typedef struct
{
    vertextype vertex[MAXVERTEX];   //頂點表
    arctype arc[MAXVERTEX][MAXVERTEX];  //鄰接矩陣
    int vertexnum;  //圖的當前頂點數
    int arcnum; //圖的當前邊數
}MGraph;

儲存結構裡面主要由四部分構成,

第一部分是一個一維陣列儲存的是頂點資訊,

第二部分是鄰接矩陣由二維陣列組成,儲存著各頂點彼此之間的關係,

第三部分和第四部分分別是當前圖的頂點數和線數。

下面是具體的程式碼實現(註釋的很詳細了):

#include <iostream>
using namespace std;

#define MAXVERTEX 100   //圖的最大頂點數
#define INFINITY 32767  //用有符號的int最大值表示無窮大
typedef char vertextype;    //定義定點的儲存資訊為字元型
typedef int arctype;    //定義邊的權值為int型

//圖的鄰接矩陣的儲存結構
typedef struct
{
    vertextype vertex[MAXVERTEX];   //頂點表
    arctype arc[MAXVERTEX][MAXVERTEX];  //鄰接矩陣
    int vertexnum;  //圖的當前頂點數
    int arcnum; //圖的當前邊數
}MGraph;

//建立無向網
void CreateMGraph(MGraph &G)
{
    cin >> G.vertexnum; //輸入頂點數目
    cin >> G.arcnum;    //輸入邊數
    for(int i = 0; i < G.vertexnum; i++)    //輸入頂點資訊
        cin >> G.vertex[i];
    for(int i = 0; i < G.vertexnum; i++)    //將所有邊初始化為無窮大
        for(int j = 0; j < G.vertexnum; j++)
            G.arc[i][j] = INFINITY;
    for(int k = 0; k < G.arcnum; k++)
    {
        int i, j, w;
        cin >> i >> j;  //輸入構成邊的兩個頂點
        cin >> w;   //輸入邊所對應的權值
        G.arc[i][j] = w;
        G.arc[j][i] = G.arc[i][j];  //無向圖的鄰接矩陣為對稱矩陣
    }
}

//列印鄰接矩陣
void PrintfMGraph(MGraph G)
{
    for(int i = 0; i < G.vertexnum; i++)
    {
        for(int j = 0; j < G.vertexnum; j++)
            cout << G.arc[i][j] << '\t';
        cout << endl;
    }
}

//主函式
int main()
{
    MGraph G;
    CreateMGraph(G);
    PrintfMGraph(G);
    return 0;
} 

鄰接矩陣的時間複雜度為O(n +  n^2 + e),其中n為頂點數,e為邊數,去掉低階和係數後,變為O(n^2)。

執行結果(根據上面第二個圖輸入的資料):