1. 程式人生 > >圖的基本概念與儲存

圖的基本概念與儲存

<一>圖的基本概念

(1);圖由頂點(vertex), 邊(edge)組成,記號G(V,E)表示圖G的頂點集為V,邊集為E。

V={v1,v2,…… } 是有限非空集合,為頂點集,其元素稱為頂點或結點

E={e1,e2,…… } 是有限集合,稱為邊集

(2);無向圖  邊沒有方向

1. 頂點集和邊集分別為:(舉例表示)
    V(G2)={v1,v2,v3,v4}
    E(G2)={(vl,v2),(v1,v3),(v1,v4),(v2,v3),(v2,v4),(v3,v4)}

   有向圖  每條邊都有方向,由始點指向終點

1.頂點集和邊集分別為:

      V(G1)={v1,v2,v3}

      E(G1)={<v1,v2>,<v2,v1>,<v2,v3>}

2. 度  指與該頂點想連的邊數

    入度;頂點的入邊條數

出度;頂點的出邊條數

(3);頂點與邊數的關係

1若G是無向圖,則0≤e≤n(n-1)/2
     恰有n(n-1)/2條邊的無向圖稱無向完全圖(Undireet-ed Complete Graph)
2若G是有向圖,則0≤e≤n(n-1)。
     恰有n(n-1)條邊的有向圖稱為有向完全圖(Directed Complete Graph)。

(4)聯通塊

1聯通分量(無向圖)

     連通;兩個頂點相連,或者可通過一定路徑到達。

連通圖;任意兩個頂點,都是連通的   

否則為非連通圖,稱其中極大連通子圖為連通分量

2.強連通分量.(有向圖)

強連通;兩個頂點可以各自通過一定有向路徑到達另外一個頂點

  強連通圖;任意兩個頂點,都是強連通的

否則為非強連通圖,稱其中極大強連通子圖為強連通分量

<二>.圖的儲存

(1).鄰接矩陣

   設圖G(V,E)  的頂點標號為0,1,2,…,N-1,令二維陣列G[N][N]表示圖的頂點標號,可令如果G[i][j]=1則表示i與j有邊,G[i][j]=0則i與j無邊

(無向圖為對稱式的結構)

另外可以新增二維陣列的值來表示權值

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <queue>
#include <vector>
#include <cmath>
#include <set>
#include <deque>
#include <map>
#include <string>

using namespace std;
/*******************
  輸入格式; 
 邊數(a,b)  權值c    
 1,2    C1 
 2,3    C2 
 ……    … 
*******************/

const int maxn=10000;  //定義輸入資料的最大值 
int juzhen[maxn][maxn]; 

int main(){
//   freopen("C:\\Users\\24398\\Desktop\\in-project.txt","r",stdin);
    int n;
	cin>>n;    //輸入邊數
	int a,b,c    //定義結點,權值 
	//初始化二維陣列 
	memset(juzhen,0,sizeof(juzhen));
	for(int i=0;i<n;++i){
	    cin>>a>>b>>c;
		juzhen[a][b]=c; 
	} 
	/*  後續操作 
	遍歷
	output(); 
	*/
	return 0;
} 

有向圖也可類似方法表示

(2).鄰接表

   圖中每個頂點建立一個單鏈表,第i個單鏈表中的結點表示依附於頂點Vi的邊(對有向圖是以頂點Vi為尾的弧)

//鄰接表

vector<int> Adj[N]; //開vector陣列,儲存結點i的邊 

Adj[i].push_back[j];   //新增一條從1號頂點到3號頂點的邊





 
//邊權   宣告結構體儲存 

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

vector<Node> Adj[N];   //宣告Node型


//新增
Node temp //臨時變數
temp.v=x;
temp.u=y;
Adj[i].push_back[temp];