• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 数据结构 最小生成树

数据结构 最小生成树

作者: 字体:[增加 减小] 来源:互联网 时间:2017-12-31

通过本文主要向大家介绍了数据结构,最小生成树,找出权值最小的生成树等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

实验5 最小生成树

一、实验目的

1.进一步掌握图的结构及非线性特点,递归特点和动态性。

2.进一步巩固最小生成树的两种求解算法。

二、实验原理

构造最小生成树(MST)就是找出权值最小的生成树。

思想:从顶点 v0 开始,选择离 v0 最近顶点 v1 构成树 T1 ,再连接与 T1 最近顶点 v2 构成树 T2, 如此重复直到所有顶点均在所构成树中为止。

遵循原则:

1、尽可能选取权值小的边,但不能构成回路;

2、选取n-1条恰当的边以连通n个顶点

首先明确:

利用 lowcost[ ] 数组记录距离此顶点最近的权值;G[i][j] 存储从文件中读入的两边距离;

Closeset[i] 记录顶点i与哪个顶点相依附(因为J一直记录当前最新加入到生成树的顶点,所以这个closeset[i]就等于j);j 一直记录与当前顶点距离最小的顶点;

Prim() 函数:

首先把lowcost[ ] 中的数据初始化为顶点0 到其他顶点的距离,把closeset[j]置为0(即:顶点i都依附于0顶点)

进入循环:循环vcount-1次(最后一个顶点直接放到最后,不用比较)

第一次:

1. 第一次就是找出距离顶点0最近的顶点,通过比较lowcost[i],找最小

2. 找到距离顶点0 最近的顶点 j 后,把总距离加上当前G[ j ][father[ j ];输出两个顶点和他们之间的距离G[j][father[j]]

3. 初始化lowcost[i],等于顶点J到各个顶点i的距离,closeset[j]置为J

   第二次:

1. 从顶点j到其他顶点的距离中找到最小值,通过比较lowcost[i],找最小

2. 找到了距离最近的顶点 j 后,把总距离加上当前G[ J ][father[ j ];输出两个顶点和他们之间的距离G[J][father[j]]

3. 初始化lowcost[i],等于顶点j到各个顶点i的距离,closeset[j]置为j

   第三次

..

..

…

第vcount-1次

最终把所以顶点都连接起来,构造好了最小生成树,输出最小权值之和。

应用:要连通n个城市需要n-1条边线路。可以把边上的权值解释为线路的造价。则最小生成树表示使其造价最小的生成树。

 

三、参考程序

 

#include<stdio.h>

#include<string.h>

#include <stdlib.h>

#define infinity 1000000

#define max_vertexes 6 //  定义图形中顶点的个数

typedef int Graph[max_vertexes][max_vertexes];// 边上的权值

void prim(Graph G,int vcount,int father[]){  

  int i,j,k;

  int lowcost[max_vertexes];//最小代价边上的权值

  int closeset[max_vertexes],used[max_vertexes];//依附在U中的顶点;标记是否已被选中

  int min;

  int result=0;//记录最短距离的和

//首先从顶点0开始,初始化数据

  for (i=0;i<vcount;i++){  //初始化所有数组,把最短距离初始化为其他顶点到1结点的距离

   lowcost[i]=G[0][i];

    closeset[i]=0;   

    used[i]=0;  

    father[i]=-1;

}  

   used[0]=1;

   printf("%s %s  %s\n","前顶点","后顶点","距离");

 

//循环VCOUNT-1次,//从lowcost[i]中找到最小值并把此结点加入生成树

  for (i=0;i<vcount-1;i++){

   j=0;

    min = infinity;

 

for (k=1;k<vcount;k++)

if ((!used[k])&&(lowcost[k]<min)){

min = lowcost[k];

     j=k;//j一直记录最近结点

}

//找到J,使两个依附,并输出

    father[j]=closeset[j]; //构造两顶点依附

    printf("  %d     %d     ",father[j]+1,j+1);//输出当前找到的结点,及该顶点依附的上一个结点

printf("  %d\n",G[j][father[j]]);//输出这两个顶点之间距离

result=result+G[j][father[j]];                          

used[j]=1;//把第j个顶点并入了U中,记录j顶点已被用

//初始化,从当前刚找到的顶点J出发,确定所有未加入生成树的顶点到此顶点J的距离,这样下次循环时,就是从这些数据中找最小值了

for (k=1;k<vcount;k++)                               

if (!used[k]&&(G[j][k]<lowcost[k])){//保留到k的最短路径

lowcost[k]=G[j][k];   

       closeset[k]=j;

  }

}

printf("权值之和:%d",result);

}

int main()

{

  FILE *fr;

  int i,j,weight;

  Graph G;

  int father[max_vertexes];

  //初始化顶点间的距离

  for(i=0; i<max_vertexes;i++)

   for(j=0; j<max_vertexes;j++)

   G[i][j] = infinity;         

fr = fopen("prim.txt","r");

  if(!fr){

  printf("fopen failed\n");

  exit(1);

  }

//把读入的数据,对应各位给赋给各个顶点间距离

while(fscanf(fr,"%d%d%d", &i, &j, &weight) != EOF){

G[i-1][j-1] = weight;

    G[j-1][i-1] = weight;

}

prim(G,max_vertexes,father);//根据prim算法构造最小生成树

return 0;

  

}

}

prim.txt中的内容:

1 2 6

1 3 1

1 4 5

2 3 5

2 5 3

3 4 5

3 5 6

3 6 4

5 6 6

4 6 2

 

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 数据结构 多关键字排序
  • 数据结构 哈希表设计
  • 数据结构 最小生成树
  • 数据结构 数组顺序存储详细介绍
  • 数据结构之数组Array实例详解
  • C语言数据结构 栈的基础操作
  • C语言数据结构二叉树简单应用
  • C语言数据结构中串的模式匹配
  • 数据结构 C语言实现循环单链表的实例
  • 数据结构与算法中二叉树子结构的详解

相关文章

  • 2017-05-28C++中sprintf()函数的使用详解
  • 2017-05-28大数据情况下桶排序算法的运用与C++代码实现示例
  • 2017-05-28基于c++强制类型转换的(总结)详解
  • 2017-05-28c++ 一个二进制串转化为整数的解决方法
  • 2017-05-28C++基于先序、中序遍历结果重建二叉树的方法
  • 2017-05-28关于移位操作的一点重要说明
  • 2017-05-28筛选法的C++实现
  • 2017-05-28WIN32程序获取父进程ID的方法
  • 2017-05-28C语言实现奇数阶魔方阵的方法
  • 2017-05-28大数(高精度数)模板(分享)

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 简单总结C++中的修饰符类型
    • C++泛型算法的一些总结
    • VC动态生成菜单项的实现方法
    • C++中实现矩阵的加法和乘法实例
    • 浅谈C++中的构造函数分类及调用规则
    • C++中的类模板详解及示例
    • Define,const,static用法总结
    • C语言中关于sizeof 和 strlen的区别分析
    • C/C++ 多线程的学习心得总结
    • 详解C++中的指针结构体数组以及指向结构体变量的指针

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有