Prim

设图G=(V,E)是一个具有n个顶点的连通网,其生成树的顶点集合为U。首先把v0放入U,再在所有的u∈U,v∈V-U的边(u,v)∈E中找一条最小权值的边,加入生成树,并把该边的v加入U集合。如果U集合已经有n个元素,则结束,否则在剩下的部分中继续寻找最小权值的边。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #define infinity 9999
  4. #define MAX 20
  5. int G[MAX][MAX],spanning[MAX][MAX],n;
  6. int prims();
  7. int main()
  8. {
  9. int i,j,total_cost;
  10. printf("Enter no. of vertices:");
  11. scanf("%d",&n);
  12. printf("\nEnter the adjacency matrix:\n");
  13. for(i=;i<n;i++)
  14. for(j=;j<n;j++)
  15. scanf("%d",&G[i][j]);
  16. total_cost=prims();
  17. printf("\nspanning tree matrix:\n");
  18. for(i=;i<n;i++)
  19. {
  20. printf("\n");
  21. for(j=;j<n;j++)
  22. printf("%d\t",spanning[i][j]);
  23. }
  24. printf("\n\nTotal cost of spanning tree=%d",total_cost);
  25. return ;
  26. }
  27. int prims()
  28. {
  29. int cost[MAX][MAX];
  30. int u,v,min_distance,distance[MAX],from[MAX];
  31. int visited[MAX],no_of_edges,i,min_cost,j;
  32. //create cost[][] matrix,spanning[][]
  33. for(i=;i<n;i++)
  34. for(j=;j<n;j++)
  35. {
  36. if(G[i][j]==)
  37. cost[i][j]=infinity;
  38. else
  39. cost[i][j]=G[i][j];
  40. spanning[i][j]=;
  41. }
  42. //initialise visited[],distance[] and from[]
  43. distance[]=;
  44. visited[]=;
  45. for(i=;i<n;i++)
  46. {
  47. distance[i]=cost[][i];
  48. from[i]=;
  49. visited[i]=;
  50. }
  51. min_cost=; //cost of spanning tree
  52. no_of_edges=n-; //no. of edges to be added
  53. while(no_of_edges>)
  54. {
  55. //find the vertex at minimum distance from the tree
  56. min_distance=infinity;
  57. for(i=;i<n;i++)
  58. if(visited[i]==&&distance[i]<min_distance)
  59. {
  60. v=i;
  61. min_distance=distance[i];
  62. }
  63. u=from[v];
  64. //insert the edge in spanning tree
  65. spanning[u][v]=distance[v];
  66. spanning[v][u]=distance[v];
  67. no_of_edges--;
  68. visited[v]=;
  69. //updated the distance[] array
  70. for(i=;i<n;i++)
  71. if(visited[i]==&&cost[i][v]<distance[i])
  72. {
  73. distance[i]=cost[i][v];
  74. from[i]=v;
  75. }
  76. min_cost=min_cost+cost[u][v];
  77. }
  78. return(min_cost);
  79. }

COST = 16 + 5 + 6 + 11 + 18 =

Kruskal

  1. #include<stdio.h>
  2. #define MAX 30
  3. typedef struct edge
  4. {
  5. int u,v,w;
  6. }edge;
  7. typedef struct edgelist
  8. {
  9. edge data[MAX];
  10. int n;
  11. }edgelist;
  12. edgelist elist;
  13. int G[MAX][MAX],n;
  14. edgelist spanlist;
  15. void kruskal();
  16. int find(int belongs[],int vertexno);
  17. void union1(int belongs[],int c1,int c2);
  18. void sort();
  19. void print();
  20. void main()
  21. {
  22. int i,j,total_cost;
  23. printf("\nEnter number of vertices:");
  24. scanf("%d",&n);
  25. printf("\nEnter the adjacency matrix:\n");
  26. for(i=;i<n;i++)
  27. for(j=;j<n;j++)
  28. scanf("%d",&G[i][j]);
  29. kruskal();
  30. print();
  31. }
  32. void kruskal()
  33. {
  34. int belongs[MAX],i,j,cno1,cno2;
  35. elist.n=;
  36. for(i=;i<n;i++)
  37. for(j=;j<i;j++)
  38. {
  39. if(G[i][j]!=)
  40. {
  41. elist.data[elist.n].u=i;
  42. elist.data[elist.n].v=j;
  43. elist.data[elist.n].w=G[i][j];
  44. elist.n++;
  45. }
  46. }
  47. sort();
  48. for(i=;i<n;i++)
  49. belongs[i]=i;
  50. spanlist.n=;
  51. for(i=;i<elist.n;i++)
  52. {
  53. cno1=find(belongs,elist.data[i].u);
  54. cno2=find(belongs,elist.data[i].v);
  55. if(cno1!=cno2)
  56. {
  57. spanlist.data[spanlist.n]=elist.data[i];
  58. spanlist.n=spanlist.n+;
  59. union1(belongs,cno1,cno2);
  60. }
  61. }
  62. }
  63. int find(int belongs[],int vertexno)
  64. {
  65. return(belongs[vertexno]);
  66. }
  67. void union1(int belongs[],int c1,int c2)
  68. {
  69. int i;
  70. for(i=;i<n;i++)
  71. if(belongs[i]==c2)
  72. belongs[i]=c1;
  73. }
  74. void sort()
  75. {
  76. int i,j;
  77. edge temp;
  78. for(i=;i<elist.n;i++)
  79. for(j=;j<elist.n-;j++)
  80. if(elist.data[j].w>elist.data[j+].w)
  81. {
  82. temp=elist.data[j];
  83. elist.data[j]=elist.data[j+];
  84. elist.data[j+]=temp;
  85. }
  86. }
  87. void print()
  88. {
  89. int i,cost=;
  90. for(i=;i<spanlist.n;i++)
  91. {
  92. printf("\n%d\t%d\t%d",spanlist.data[i].u,spanlist.data[i].v,spanlist.data[i].w);
  93. cost=cost+spanlist.data[i].w;
  94. }
  95. printf("\n\nCost of the spanning tree=%d",cost);
  96. }

prim算法和克鲁斯卡尔算法的更多相关文章

  1. prim算法,克鲁斯卡尔算法---最小生成树

    最小生成树的一个作用,就是求最小花费.要在n个城市之间铺设光缆,主要目标是要使这 n 个城市的任意两个之间都可以通信,但铺设光缆的费用很高,且各个城市之间铺设光缆的费用不同,因此另一个目标是要使铺设光 ...

  2. 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)

    普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...

  3. hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)

    还是畅通project Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  4. Kurskal算法(克鲁斯卡尔算法)

    特点:适用于稀疏图,边比较少的图.如果顶点较少,且为稠密图,则用Prim算法.跟Prim算法的用途相同.时间复杂度为O(e*loge),其中e为边数. 代码: #include <stdio.h ...

  5. 最小生成树-克鲁斯卡尔算法(kruskal's algorithm)实现

    算法描述 克鲁斯卡尔算法是一种贪心算法,因为它每一步都挑选当前最轻的边而并不知道全局路径的情况. 算法最关键的一个步骤是要判断要加入mst的顶点是否会形成回路,我们可以利用并查集的技术来做. 并查集的 ...

  6. 最小生成树之Kruskal(克鲁斯卡尔)算法

    学习最小生成树算法之前我们先来了解下下面这些概念: 树(Tree):如果一个无向连通图中不存在回路,则这种图称为树. 生成树 (Spanning Tree):无向连通图G的一个子图如果是一颗包含G的所 ...

  7. 最小生成树--克鲁斯卡尔算法(Kruskal)

    按照惯例,接下来是本篇目录: $1 什么是最小生成树? $2 什么是克鲁斯卡尔算法? $3 克鲁斯卡尔算法的例题 摘要:本片讲的是最小生成树中的玄学算法--克鲁斯卡尔算法,然后就没有然后了. $1 什 ...

  8. 贪心算法(Greedy Algorithm)之最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)是两个经典的最小生成树算法的较为简单理解的一个.这里面充分体现了贪心算法的精髓.大致的流程能够用一个图来表示.这里的图的选择借用了Wikiped ...

  9. 贪心算法(Greedy Algorithm)最小生成树 克鲁斯卡尔算法(Kruskal&#39;s algorithm)

    克鲁斯卡尔算法(Kruskal's algorithm)它既是古典最低的一个简单的了解生成树算法. 这充分反映了这一点贪心算法的精髓.该方法可以通常的图被表示.图选择这里借用Wikipedia在.非常 ...

随机推荐

  1. 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库和编 ...

  2. yii2.0 url美化-apache服务器

    //配置内容 'urlManager' => [ 'enablePrettyUrl' => true, 'enableStrictParsing' => false, //不启用严格 ...

  3. bootstrap日期选择

    <input type="text" class="form-control datepicker" style="padding: 0.375 ...

  4. html初识form表单

    定义和用法 <form> 标签用于为用户输入创建 HTML 表单. 表单能够包含 input 元素,比如文本字段.复选框.单选框.提交按钮等等. 表单用于向服务器传输数据.通过submit ...

  5. wayne生产环境部署(360的容器发布平台-开源)

    参考文档 http://360yun.org/wayne/dev/develop-flow.html 使用rke部署k8s,详细过程见前面 文章,同时部署好kubectl 安装go yum insta ...

  6. 初次见面,C++(的博客作业)

    懵懂无知.编程是什么?要是你在两个月前问我这个问题,你可能只会得到一个回答“天知道”.依稀记得在初中,上电脑课的老师曾经触及过编程的皮毛(那时候也没有编程的概念,听的似懂非懂),旁边一个同学却在十分熟 ...

  7. L2-018 多项式A除以B(模拟)

    这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出一个非零多项式,先给出A,再给出B.每行的 ...

  8. css样式之input输入框默认样式

    帮朋友写个简单的课程设计,后面会贴出来,项目刚开始就遇到一个坑(给input输入框设定样式,但是,点击后会出现蓝色边框),之前写其他的项目时也遇到过,百度一下资料解决了,现在又碰到了,写一下,留着备用 ...

  9. Mybatis 接口代理的实现(BeanDefinitionRegistryPostProcessor+FactoryBean)

    相信在开发中,尤其是mybatis 配置操作中,我们只需要提供一个mapper 接口,然后注入到service 中,就可以进行调用. 按我们的一般逻辑来说,我们并没有进行接口的实现,应该会报空指针异常 ...

  10. Vue --1

    1.2 vue.js库的基本使用 在github下载:https://github.com/vuejs/vue/releases 在官网下载地址: https://cn.vuejs.org/v2/gu ...