求图的最小生成树的prime算法和Kruskal算法
来源:互联网 发布:python for none 编辑:程序博客网 时间:2024/06/06 00:34
prime算法原理
1.首先清空树,任取一个顶点加入生成树。
2.在那些一个顶点在生成树李,另一个顶点不在生成树里德边中,选取边权最小的一条边,把这条边的另一个顶点加入生成树。
3.重复步骤2,直到所有的顶点均加入了生成树。
如图所示:
代码:
int map[max][max];int vis[max];int d[max];int prime(){int sum=0;int index=1; //先将顶点1加入生成树vis[1]=1; //标记顶点1 for(int i=0;i<m;i++) //将与顶点1相连的边的权值赋给d数组 { d[i]=map[index][i]; } for(int i=1;i<m;i++) { int min=MAX; //MAX为定义的无穷大 for(int j=0;j<m;j++) //找边权最小值 { if(!vis[j] && d[j]<min) { min=d[j]; index=j; } } vis[index]=1;//标记掉(把index加入生成树) sum+=min; for(int j=0;j<m;j++)//更新边权 { if(!vis[j] && d[j]>map[index][j]) d[j]=map[index][j]; } } return sum;}int main(){/*要在主函数中先将map数组定义为无穷大,将vis数组清空,然后在输入顶点与边权*/for(int i=0;i<max;i++){for(int j=0;j<max;j++){map[i][j]=MAX;}}memset(vis,0,sizeof(vis));}
Kruskal算法
原理:先将子图看成一个只含有n个顶点的不含边的图,各个顶点看成是各自树的根节点。
从边集中选取一条权值最小的边,判断该边的两个顶点是否分属不同的树,若是则将其加入子图,然后将这两个顶点分别所在的树合成一棵树;若不是,则说明这两个点已在一颗树上,不可取。(用到了并查集)
代码:
int father[max];int rank[max];struct node{//将边的边权、起点、终点int val,start,end;}edge[边的最多的条数];void make()//初始化{for(int i=0;i<n;i++){father[i]=i;rank[i]=1;}}int find(int x)//找根节点{int i,j=x;while(j!=father[j]){j=father[j];}while(x!=j){i=father[x];father[x]=j;x=i;}return j;}void union(int x,int y){x=find(x);y=find(y);if(x==y)return;if(rank[x]<rank[y])//合并{father[x]=find(y);}else{if(rank[x]==rank[y]){rank[x]++;}father[y]=find(x);}}int Kruskal(int n){int sum=0;make();for(int i=0;i<n;i++)//从边权最小的边开始加入图中{if(find(edge[i].start)!=find(edge[i].end)){union(edge[i].start,edge[i].end);sum+=edge[i].val;}}return sum;}bool cmp(node a,node b){return a.val<b.val;}int main(){//输入边的边权,起点,终点//在主函数内将边按边权从小到大排序sort(edge,edge+边的条数,cmp);int ans=Kruskal(n);//n为边的数量}
0 0
- 求图的最小生成树的prime算法和Kruskal算法
- 最小生成树的prime和kruskal算法
- 求最小生成树的Kruskal算法
- 实现Kruskal算法,求图的最小生成树。
- prime算法求无向图的最小生成树
- 最小生成树(kruskal算法)和 (Prime算法)
- 图的最小生成树:Prim算法和Kruskal算法
- 最小生成树---Kruskal/Prime算法
- 最小生成树算法[Prime/(Kruskal)]
- 图的最小生成树Kruskal算法
- Prim算法求最小生成树MST以及和kruskal算法的对比
- Kruskal算法求最小生成树的c++代码实现
- 求最小生成树的克鲁斯卡尔(Kruskal)算法
- 第七章 图(最小生成树之prime算法和 kruskal算法)
- 最小生成树的prim算法和kruskal算法
- 关于最小生成树的Prim算法和Kruskal算法
- 算法学习之图的最小生成树Kruskal算法
- 【算法】图的最小生成树(Kruskal算法)
- ruby进行rpc服务的建立,并且设置端口号(XMLRPC 及 ruby的xmlrpc如何使用)
- 一些比较好的博客
- Win32知识点整理(2)
- Ubuntu apt-get更新及安装软件失败的解决方法
- 怎么安装Ubuntu应用到Device中
- 求图的最小生成树的prime算法和Kruskal算法
- bash字符串截取
- hdu 4920 Matrix multiplication(矩阵坑题)
- 用Qt Quick快速设计UI
- JavaScript对Cookie的操作-设置Cookie、获得Cookie、删除Cookie
- winpcap示例程序采用VC6编译时出错error C2054: expected '(' to follow '_W64'
- 一步一步的学习BroadCastReceiver
- hdoj4883 TIANKENG’s restaurant
- python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求