prim算法和克鲁斯卡尔算法
Prim
设图G=(V,E)是一个具有n个顶点的连通网,其生成树的顶点集合为U。首先把v0放入U,再在所有的u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树,并把该边的v加入U集合。如果U集合已经有n个元素,则结束,否则在剩下的部分中继续寻找最小权值的边。
- #include<stdio.h>
- #include<stdlib.h>
- #define infinity 9999
- #define MAX 20
- int G[MAX][MAX],spanning[MAX][MAX],n;
- int prims();
- int main()
- {
- int i,j,total_cost;
- printf("Enter no. of vertices:");
- scanf("%d",&n);
- printf("\nEnter the adjacency matrix:\n");
- for(i=;i<n;i++)
- for(j=;j<n;j++)
- scanf("%d",&G[i][j]);
- total_cost=prims();
- printf("\nspanning tree matrix:\n");
- for(i=;i<n;i++)
- {
- printf("\n");
- for(j=;j<n;j++)
- printf("%d\t",spanning[i][j]);
- }
- printf("\n\nTotal cost of spanning tree=%d",total_cost);
- return ;
- }
- int prims()
- {
- int cost[MAX][MAX];
- int u,v,min_distance,distance[MAX],from[MAX];
- int visited[MAX],no_of_edges,i,min_cost,j;
- //create cost[][] matrix,spanning[][]
- for(i=;i<n;i++)
- for(j=;j<n;j++)
- {
- if(G[i][j]==)
- cost[i][j]=infinity;
- else
- cost[i][j]=G[i][j];
- spanning[i][j]=;
- }
- //initialise visited[],distance[] and from[]
- distance[]=;
- visited[]=;
- for(i=;i<n;i++)
- {
- distance[i]=cost[][i];
- from[i]=;
- visited[i]=;
- }
- min_cost=; //cost of spanning tree
- no_of_edges=n-; //no. of edges to be added
- while(no_of_edges>)
- {
- //find the vertex at minimum distance from the tree
- min_distance=infinity;
- for(i=;i<n;i++)
- if(visited[i]==&&distance[i]<min_distance)
- {
- v=i;
- min_distance=distance[i];
- }
- u=from[v];
- //insert the edge in spanning tree
- spanning[u][v]=distance[v];
- spanning[v][u]=distance[v];
- no_of_edges--;
- visited[v]=;
- //updated the distance[] array
- for(i=;i<n;i++)
- if(visited[i]==&&cost[i][v]<distance[i])
- {
- distance[i]=cost[i][v];
- from[i]=v;
- }
- min_cost=min_cost+cost[u][v];
- }
- return(min_cost);
- }
COST = 16 + 5 + 6 + 11 + 18 =
Kruskal
- #include<stdio.h>
- #define MAX 30
- typedef struct edge
- {
- int u,v,w;
- }edge;
- typedef struct edgelist
- {
- edge data[MAX];
- int n;
- }edgelist;
- edgelist elist;
- int G[MAX][MAX],n;
- edgelist spanlist;
- void kruskal();
- int find(int belongs[],int vertexno);
- void union1(int belongs[],int c1,int c2);
- void sort();
- void print();
- void main()
- {
- int i,j,total_cost;
- printf("\nEnter number of vertices:");
- scanf("%d",&n);
- printf("\nEnter the adjacency matrix:\n");
- for(i=;i<n;i++)
- for(j=;j<n;j++)
- scanf("%d",&G[i][j]);
- kruskal();
- print();
- }
- void kruskal()
- {
- int belongs[MAX],i,j,cno1,cno2;
- elist.n=;
- for(i=;i<n;i++)
- for(j=;j<i;j++)
- {
- if(G[i][j]!=)
- {
- elist.data[elist.n].u=i;
- elist.data[elist.n].v=j;
- elist.data[elist.n].w=G[i][j];
- elist.n++;
- }
- }
- sort();
- for(i=;i<n;i++)
- belongs[i]=i;
- spanlist.n=;
- for(i=;i<elist.n;i++)
- {
- cno1=find(belongs,elist.data[i].u);
- cno2=find(belongs,elist.data[i].v);
- if(cno1!=cno2)
- {
- spanlist.data[spanlist.n]=elist.data[i];
- spanlist.n=spanlist.n+;
- union1(belongs,cno1,cno2);
- }
- }
- }
- int find(int belongs[],int vertexno)
- {
- return(belongs[vertexno]);
- }
- void union1(int belongs[],int c1,int c2)
- {
- int i;
- for(i=;i<n;i++)
- if(belongs[i]==c2)
- belongs[i]=c1;
- }
- void sort()
- {
- int i,j;
- edge temp;
- for(i=;i<elist.n;i++)
- for(j=;j<elist.n-;j++)
- if(elist.data[j].w>elist.data[j+].w)
- {
- temp=elist.data[j];
- elist.data[j]=elist.data[j+];
- elist.data[j+]=temp;
- }
- }
- void print()
- {
- int i,cost=;
- for(i=;i<spanlist.n;i++)
- {
- printf("\n%d\t%d\t%d",spanlist.data[i].u,spanlist.data[i].v,spanlist.data[i].w);
- cost=cost+spanlist.data[i].w;
- }
- printf("\n\nCost of the spanning tree=%d",cost);
- }
prim算法和克鲁斯卡尔算法的更多相关文章
- prim算法,克鲁斯卡尔算法---最小生成树
最小生成树的一个作用,就是求最小花费.要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光 ...
- 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...
- hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- Kurskal算法(克鲁斯卡尔算法)
特点:适用于稀疏图,边比较少的图.如果顶点较少,且为稠密图,则用Prim算法.跟Prim算法的用途相同.时间复杂度为O(e*loge),其中e为边数. 代码: #include <stdio.h ...
- 最小生成树-克鲁斯卡尔算法(kruskal's algorithm)实现
算法描述 克鲁斯卡尔算法是一种贪心算法,因为它每一步都挑选当前最轻的边而并不知道全局路径的情况. 算法最关键的一个步骤是要判断要加入mst的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...
- 最小生成树之Kruskal(克鲁斯卡尔)算法
学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...
- 最小生成树--克鲁斯卡尔算法(Kruskal)
按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...
- 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...
- 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal's algorithm)
克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...
随机推荐
- mac book pro macOS10.13.3安装qt、qt creator C++开发环境,qt5.11.1,并解决cmake构建:qt mac this file is not part of any project the code
因为之前在Ubuntu下使用的是qtcreator开发,现在想在mac上装一个系统,因为许久未装了,还是花了点时间,不如写个博客,下次就更快安装了.在Mac OS X下使用Qt开发,需要配置Qt库和编 ...
- yii2.0 url美化-apache服务器
//配置内容 'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => false, //不启用严格 ...
- bootstrap日期选择
<input type="text" class="form-control datepicker" style="padding: 0.375 ...
- html初识form表单
定义和用法 <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 表单用于向服务器传输数据.通过submit ...
- wayne生产环境部署(360的容器发布平台-开源)
参考文档 http://360yun.org/wayne/dev/develop-flow.html 使用rke部署k8s,详细过程见前面 文章,同时部署好kubectl 安装go yum insta ...
- 初次见面,C++(的博客作业)
懵懂无知.编程是什么?要是你在两个月前问我这个问题,你可能只会得到一个回答“天知道”.依稀记得在初中,上电脑课的老师曾经触及过编程的皮毛(那时候也没有编程的概念,听的似懂非懂),旁边一个同学却在十分熟 ...
- L2-018 多项式A除以B(模拟)
这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一个非零多项式,先给出A,再给出B.每行的 ...
- css样式之input输入框默认样式
帮朋友写个简单的课程设计,后面会贴出来,项目刚开始就遇到一个坑(给input输入框设定样式,但是,点击后会出现蓝色边框),之前写其他的项目时也遇到过,百度一下资料解决了,现在又碰到了,写一下,留着备用 ...
- Mybatis 接口代理的实现(BeanDefinitionRegistryPostProcessor+FactoryBean)
相信在开发中,尤其是mybatis 配置操作中,我们只需要提供一个mapper 接口,然后注入到service 中,就可以进行调用. 按我们的一般逻辑来说,我们并没有进行接口的实现,应该会报空指针异常 ...
- Vue --1
1.2 vue.js库的基本使用 在github下载:https://github.com/vuejs/vue/releases 在官网下载地址: https://cn.vuejs.org/v2/gu ...