prim算法:
1. 从无向网中的任一点开始,例如V0,将其放入集合V
2. 寻找离集合V中的点距离最近的点Vn,加入集合。
3. 重复2,直到V中包含无向网中的所有点
伪码:
无向网中有n个点
V0加入集合V
当前点 = V0
初始化到各点的距离为[V0,Vi]即V0到各点的距离。
while(--n) //每次加入一个点
{
寻找离当前点最近的且未加入集合的点
将该点加入集合,当前点 = 该点
for( int i=0; i<n; i++)
{
如果当前点到Vi点距离小于原来的距离,则替换掉
}
}
http://baike.baidu.com/view/580409.htm
kruskal算法:
K r u s k a l算法每次选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。K r u s k a l算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出现环路,则将其抛弃,否则,将它选入。
有个例子
题目:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&contestId=325&id=2119
解答:http://blog.csdn.net/wgh_yesterday/article/details/6646705
另外:
http://baike.baidu.com/view/247951.htm 这里有点错误的
这个函数
int findset(vector<int> & parent, int i)
{
if(i != parent[i]) //这句是错的。这样只检查上一个是找不到源头的。改成while( i != parent[i])
i=parent[i];
return i;
}