first editor:20170625
last editor:20170625
一、定义
二、存储结构
三、遍历
深度优先遍历
广度优先遍历
-
思想
- 邻接矩阵的广度优先遍历
四、最小生成树
- 切分定理
- 切分:图的切分是将图的所有顶点分为两个非空且不重复的边的集合
- 横切边:横切边是连接两个属于不同集合的顶点的边
- 切分定理 :在一幅加权图中,给定任意的切分,它的横切边中的权重最小者必然属于图的最小生成树
- 切分定理是解决最小生成树问题所有算法的基础。
- 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;
}
}
}
}