圖論——圖的儲存
阿新 • • 發佈:2018-12-17
一、圖的基礎知識:
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));
圖的基礎知識和圖的儲存到此為止,下一篇文章接著講解圖的遍歷。有錯誤請及時指出。