最小生成树简单概念:
在数个点间,两点之间存在权值,求若涉及所有的点时,权值之和最小。
常用算法:
1.prim算法
首先将每一个点之间的距离都定为最大值,把第一个点的最小距离设为零,在与第一个点有联系的每一个点中找出权值最小的点,依此规律进行循环,直到找到所有的点。
例:最优布线问题中的循环部分
for(j=1;j<=n;j++)
{
if(u[j]&&(minn[j]<minn[k]))
k=j;
u[k]=false;
}
for(j=1;j<=n;j++)
{
if(u[j]&&(g[k][j]<minn[j]))
minn[j]=g[k][j];
}
}
int total=0;
for(i=1;i<=n;i++)
{
total+=minn[i];
}
2.kruskal算法
首先把每一个点都定为一个集合,并且每次选择一个最小的点,把它放入一个集合里,注意如果集合里已经有那个点 ,则与这个点直接连接的点就不能再次加入集合,由于每次加入的也是最小的边,所以可以得出最小生成数。
个人感想:
对一般的问题而言,基本上首先采用第一个算法,不过有的时候第一个算法可能会超时,所以对题目中采用数据的范围要注意一些。更普遍地来这样两者基本上都有贪心的算法,所以感觉这部分的题应该有些可以直接用贪心的做法来解决。