圖的基本概念與儲存
阿新 • • 發佈:2018-12-11
<一>圖的基本概念
(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];