1. 程式人生 > >圖論——圖的儲存

圖論——圖的儲存

一、圖的基礎知識:

1.圖分類:

      有向圖:邊用帶箭頭的直線表示,邊均為單向的

      無向圖:邊用不帶箭頭的直線表示,所有的邊均為雙向的

      帶權圖:邊或者點加上表示某種含義的數值,稱“點權”或者“邊權”

2.頂點的度:

      無向圖:指與頂點v相連的邊的數目

      有向圖:有出度和入度,出度是以頂點v為起點,,入度是以頂點v為終點。有向圖的度=出度+入度。

      所有頂點的度=邊數的2倍

3.圖的連通性:

      聯通:如果存在一條從頂點U到頂點V的路徑,稱U和V聯通。

      聯通圖:圖中的任意兩點都聯通,否則的話為非連通圖。

      聯通分量:無向圖中的極大聯通子圖。

二、圖的儲存(2種方式)

1.鄰接矩陣:

      令圖的頂點標號為0,1,.....n-1,開一個二維陣列G[n][n],陣列的兩維分別表示圖的頂點的標號。若G[i][j]為1,則頂點 i 和頂點 j 之間有邊,若為0則不存在邊。當然G[i][j]也可以用來存放頂點 i 到頂點 j 的邊權。

       但鄰接矩陣有個致命的缺點就是隻能儲存頂點數目不大的圖(一般在1000以內),否則的話會記憶體超限,這就需要用圖的第二種儲存方法來彌補這個缺點了。

2、鄰接表:

      依然給圖的頂點依次編號為0,1,.....n-1,每個頂點都可能有若干條出邊,把同一個頂點的所有出邊放在一個列表中就會對應有n個列表,稱為鄰接表。下面用一種比較易於理解的方法來實現鄰接表,利用vector來實現。

      vector<int> adj[n];//存放每條邊的終點編號

      但是如果碰見了帶有權值的圖怎麼辦呢??????

      答案依然是用vector,但是是結合結構體實現的vector,如下:

struct Node{
    int v;//邊的終點編號
    int w;//邊權
}Adj[n];

//插入頂點資訊時可以宣告一個Node型別的臨時變數temp
//例如向頂點1中新增資訊,終點為3,邊權為4;

Node temp;
temp.v=3;
temp.w=4;
Adj[1].push_back(temp);

//還可以再改進一下上面的新增頂點資訊的方法,用建構函式,如下:

struct Node{
    int v,w;
    Node(int _v,int _w):v(_v),w(_w) {}
}Adj[n];

Adj[1].push_back(Node(3,4));

圖的基礎知識和圖的儲存到此為止,下一篇文章接著講解圖的遍歷。有錯誤請及時指出。