若G(V,E)是含n個頂點的圖,表示圖G的矩陣為mat[n][n]
存在邊的矩陣為mat[i][j]=1
不存在邊的矩陣為mat[i][j]=0
無向圖的相鄰矩陣為對稱
有向圖的相鄰矩陣為非對稱
因上述的串鏈表示法空間需求較大,因此可改為一維的方式將圖中所有頂點將圖中所有頂點集合。
陣列的空間表示方式為mat[n+2e+1],n為頂點數,2e為頂點數*分支度。
以G4為例,索引0~8為陣列的初始位置,9~22為儲存值
實作連結:矩陣串鏈表示法
先略
#define FALSE 0
#define TRUE 1
short int visited[MAX_VERTICES];
void dfs(int v){
node_pointer w;
visited[v]= TRUE;
printf(“%5d”, v);
for (w=graph[v]; w; w=w->link)
if (!visited[w->vertex]){
dfs(w->vertex);
}
}
時間複雜度:
typedef struct queue *queue_pointer;
typedef struct queue {
int vertex;
queue_pointer link;
};
queue_pointer front, rear;
void addq(int); // int 為頂點編號
int deleteq();
void bfs(int v){
node_pointer w;
front = rear = NULL;
printf(“%5d”, v);
visited[v] = TRUE;
addq(v);
while (front) {
v= deleteq();
for (w=graph[v]; w; w=w->link)
if (!visited[w->vertex]) {
printf(“%5d”, w->vertex);
addq(w->vertex);
visited[w->vertex] = TRUE;
}
}
}
時間複雜度:
實作連結:DFS與BFS追蹤
一個所有邊具有成本權重的無向圖,其最小成本和為最小成本擴張樹
以下為利用貪婪法(greedy method)生成最小成本擴張樹的演算法
Kruskal’s 演算法
一次以最小成本加一個邊,當天家的邊產生迴圈則跳過
演算法
T= {};
while (T 包含少於 n-1 個邊且 E 不是空集合) {
從E選擇一個最小成本之邊 (v, w) ;
從E刪除 (v, w)邊;
若邊(v, w) 不會在T中產生迴圈,則
將 (v, w)邊加入T中
否則
放棄(v, w)邊;
}
若T包含少於 n-1個邊,則
印出”無擴張樹”之訊息;
Prim’s 演算法
每次加一個周圍最小成本的邊加入樹中,每一次添加後還是一棵樹,直到這棵樹包含n-1個邊為止
演算法:
T={};
TV={0}; /* 從頂點0開始 */
while (T包含少於 n-1個邊) {
令 (u, v) 為最小成本之邊,使得 u ? TV
且 v ? TV
若無此種邊則停止;否則
將頂點 v 加入 TV;
將邊 (u, v) 加入T;
}
若T包含少於 n-1個邊,則
印出”無擴張樹”之訊息;
Sollin’s 演算法
待補
找出單一來源到所有頂點的最短路徑
圖表法
Dijkstra’s 演算法
步驟:
所有序對時間複雜度:
最短路徑法O(n^2)*執行n次=O(n^3)
AOV網路
有向圖中的工作次序關係
前輩一定出現在繼承者前面
圖形中的拓樸次序(Topological order)
AOE網路
最早時間(e) :一個活動可以發生的最短時間
最晚時間(l) :一個活動可以發生的最遲時間
臨界程度 (時間伸縮程度):l(i) - e(i) 的差值
e(i)=l(i)的活動稱為臨界活動