first editor:20170625
last editor:20170625
一、定義
二、存儲結構
三、遍歷
深度優先遍歷
廣度優先遍歷
-
思想
大話數據結構p242
大話數據結構p242 - 鄰接矩陣的廣度優先遍歷
四、最小生成樹
- 切分定理
- 切分:圖的切分是將圖的所有頂點分為兩個非空且不重復的邊的集合
- 橫切邊:橫切邊是連接兩個屬于不同集合的頂點的邊
- 切分定理 :在一幅加權圖中,給定任意的切分,它的橫切邊中的權重最小者必然屬于圖的最小生成樹
- 切分定理是解決最小生成樹問題所有算法的基礎。
- prim算法
- 思想
從最小生成樹的起始頂點開始,每次都將下一條連接樹頂點與不在樹中頂點的權重最小的邊加入樹中 - 實現
void primMST(mGraph g){
// 當i沒有加入最小生成樹,adjvex[i]為和i相連的權值最小的橫切邊的另一個頂點
std::vector<int> adjvex(g.numV, 0);
// 當i沒有加入最小生成樹,lowcost[i]為和i相連的權值最小的橫切邊的權值
// 若i已經加入了最小生成樹,則lowcost[i] = 0;
std::vector<int> lowcost(g.numV, 0);
for (int i = 1; i < g.numV; i++) // 初始化lowcost
lowcost[i] = g.arc[0][i];
for (int i = 1; i < g.numV; i++) { //每次向mst加入一個頂點
int min = INFINITY;
int k = 0;
for(int j = 1; j < g.numV;j++) { //循環所有頂點→第一次循環即為找到和0相鄰的所有邊中,權值最小的
if (lowcost[j] != 0 && lowcost[j] < min) { //如果權值不為0,且權值小于min
min = lowcost[j]; // 權值最小的橫切邊的權值
k = j; // 當前最小值的下標存入k
}
j++;
}
printf("(%d,%d)", adjvex[k], k);
lowcost[k] = 0; //遍歷過的頂點記為0
for (int j = 1; j < g.numV; j++) { // 更新橫切邊
if (lowcost[j] != 0 && g.arc[k][j] < lowcost[j]) {
lowcost[j] = g.arc[k][j];
adjvex[j] = k;
}
}
}
}