4专题四总结

来源:互联网 发布:马雅可夫斯基 知乎 编辑:程序博客网 时间:2024/05/22 08:44

专题四主要就是最短路径问题。一般最短路径有两种算法Prim与Kruscal算法,然而这两种算法核心技术就是并查集。


并查集。即“不相交集合”。将编号分别为1…N的N个对象划分                               为不相交集合,在每个集合中,选择其中某个元素代表所在集合。常见两种操作:  合并两个集合查找某元素属于哪个集合    模板算法:void made(int n) //并查集的初始化{   int i; for(i=1;i<=n;i++)  father[i] = I;}int find(int x)//查找父结点找到集合中的代表元素{ if(x != father[x])  { father[x] = find(father[x]);} return father[x];}void unions(int x,int y) //两个元素合并成一个集合其实是组合{ x = y; y = find(y);if(x != y){father[x] = y;}}

二.        求最小生成树的prim算法:

1,        任取一个顶点加入生成树;

2,        在那些一个端点在生成树里,另一个端点不在生成树里的边中,取权最小的边,将它和另一个端点加进生成树。

3,        重复上一步骤,直到所有的顶点都进入了生成树为止。

Prim算法:设G=(V,E)是连通带权图,V={1,2,…,n}构造G的最小生成树的Prim算法的基本思想是:首先置S={1},然后,只要S是V的真子集,就作如下的贪心选择:选取满足条件iS,jV-S,且c[i][j]最小的边,将顶点j添加到S中。这个过程一直进行到S=V时为止。在这个过程中选取到的所有边恰好构成G的一棵最小生树。

三,      求最小生成树的Kruscal算法 对所有边从小到大排序;依次试探将边和它的端点加入生成树,如果加入此边后不产生圈,则将边和它的端点加入生成树;否则,将它删去;直到生成树中有了n-1条边,即告终止。算法的时间复杂度O(eloge)    将边按权值从小到大排序后逐个判断,如果当前的边加入以后不会产生环,那么就把当前边作为生成树的一条边。最终得到的结果就是最小生成树。并查集  。

总结,专题四主要的目的就是寻找最小生成树,求最短路径。这其中有两种算法:Prim算法和Kruscal算法。一个是选点,一个是选边。当题目中边的数目较为复杂时,选用prim算法。但是一般性问题时,建议选择kruscal算法,理解起来比较简单。

0 0
原创粉丝点击