最小生成树
prim(贪心算法)
- 图的类型:带权连通图
- 图的存储类型:邻接矩阵
- 基本思想:
1>初始化U={v},以v到其他顶点的所有边为侯选边
2>重复以下步骤n - 1 次
- 从侯选边中挑选权值最小的边加入U中并用k记录刚加入U中的顶点
- 考察当前V-U中的顶点j,修改侯选边,若(k,j)的权值小于原来和顶点j关联的侯选边,则用(k,j)的权值取代后者作为侯选边
- 代码实现:
public static void prim(MatGraph mg, int v){ int n = mg.n; int [] lowcost = new int [n]; int [] closest = new int [n]; int min = INF;//临时存储边与边之间的权值 int k = 0;//记录最近顶点的编号 for (int i = 0; i < n; i++) { lowcost[i] = mg.edges[v][i]; closest[i] = v; } //使 n - 1 个顶点加入到U中 for (int i = 1; i < n; i++) { min = INF; for (int j = 0; j < n; j++) { if (lowcost[j] != 0&&lowcost[j] < min){ min = lowcost[j]; k = j; } } System.out.printf("边(%d,%d)权为:%d\n",closest[k],k,min); lowcost[k] = 0;//标记k已经加入U中 for (int j = 0; j < n; j++) { if(lowcost[j] != 0&&mg.edges[k][j] < lowcost[j]){ lowcost[j] = mg.edges[k][j]; closest[j] = k;//修改数组lowcost和closest } } } }