算法介绍
贪心算法:
贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。即通过每次贪最优的情况,直到问题结束,是通过局部最优达到整体最优的解决问题的方法。
问题实例
问题描述:
连通带权图G=(V,E) 其中V={1,2,3,4,5,6},E为10条边的集合,如上图。
请编程求解该图G的一棵最小生成树
分别使用Prim算法和Kruskal算法解决该问题
(一)Prim算法
贪心策略:每次选择到下一顶点权值最小的边
伪代码:
①将所有顶点放入集合V{}中,设最小生成树顶点集S{}。
②将选一点放入S{}中,然后每次选择V-S中离S中顶点最近的顶点加入到S中。
③当V中顶点全都放入S中,结束。
过程如图所示:
代码:
#include <iostream>
using namespace std;
#define M 9999
const int N = 6;
void Prim (int n,int **c)
{
int closest[N+1];// j属于V-S 外,代表closest[j] j离S最近的点
int lowcost[N+1]; // lowset代表最小的权值 c[i][closet[j]]
bool s[N+1]; // 代表顶点
s[1]=true;
for(int i=2;i<n;i++) //初始化
{
closest[i]=1;
lowcost[i]=c[i][1];
s[i]=false;
}
for (int i = 1; i < n; i++)
{
int min = M;
int j = 1;
// 找出V-S中使权值最小的顶点j
for (int k = 2; k <= n; k++)
{
if ((lowcost[k] < min) && (!s[k]))
{
min = lowcost[k];
j = k;
}
}
// 找到符合贪心选择方式的边,将顶点j加入到集合S
cout << closest[j] << "--" << j << endl;
s[j] &