最小生成树Prim算法
文章作者:甘航 文章来源:http://www.cnblogs.com/ganhang-acm/转载请注明,谢谢合作。
由于数据结构老师布置的一道题 ,我看prim算法看了半天还是一知半解。
在浏览过n多大神博客后半copy半自动补脑完成了这道渣渣题。、、
题目就是从老师给的两个文件中读取数据求最小生成树。
第一个城市文件
- 北京 , 上海 , 天津 , 石家庄 , 太原 , 呼和浩特 , 沈阳 , 长春 ,哈尔滨 ,
- 济南 , 南京 , 合肥 , 杭州 , 南昌 , 福州 , 台北 , 郑州 , 武汉 ,
- 长沙 , 广州 , 海口 , 南宁 , 西安 , 银川 , 兰州 , 西宁 ,
- 乌鲁木齐 , 成都 , 贵阳 , 昆明 , 拉萨 , * -,
city.txt
第二个各城市之间距离文件
distance.txt
要求是根据这两个文件数据 求个城市最小生成树;
下面给出具体代码
代码的注释我写得很详细,方便理解,有几点需要说明一下。
1、2个for循环都是从1开始的,因为一般我们默认开始就把第0个节点加入生成树,因此之后不需要再次寻找它。
2、lowcost[i]记录的是以节点i为终点的最小边权值。初始化时因为默认把第0个节点加入生成树,因此lowcost[i] = graph[0][i],即最小边权值就是各节点到0号节点的边权值。
3、mst[i]记录的是lowcost[i]对应的起点,这样有起点,有终点,即可唯一确定一条边了。初始化时mst[i] = 0,即每条边都是从0号节点出发。
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define inf 1<<30
- #define node_num 31// 图的节点数
- struct node
- {
- char s[];//存城市名字
- int id;//这个可以不要,可以用c的下标表示
- } c[node_num];
- int G[node_num][node_num];//图的矩阵表示
- int Prim()
- {
- int lowcost[node_num];/* lowcost[i]记录以i为终点的边的最小权值,当lowcost[i]=0时表示终点i加入生成树 */
- int mst[node_num];/* mst[i]记录对应lowcost[i]的起点,当mst[i]=0时表示起点i加入生成树 */
- int i,j,min,minid,sum=;
- for(i=; i<node_num; i++)/* 默认选择0号节点加入生成树,从1号节点开始初始化 */
- {
- lowcost[i]=G[][i];/* 最短距离初始化为其他节点到0号节点的距离 */
- mst[i]=;/* 标记所有节点的起点皆为默认的0号节点 */
- }
- mst[]=;/* 标记0号节点加入生成树 */
- for(i=; i<node_num; i++)/* n个节点至少需要n-1条边构成最小生成树 */
- {
- min=inf;
- minid=;
- for(j=; j<node_num; j++)/* 找满足条件的最小权值边的节点minid */
- {
- if(lowcost[j]<min&&lowcost[j]!=)/* 边权值较小且不在生成树中 */
- {
- min=lowcost[j];
- minid=j;
- }
- }
- printf("%s -- %s: %d\n",c[mst[minid]].s,c[minid].s,min);/* 输出生成树边的信息:起点,终点,权值 */
- sum+=min;/* 累加权值 */
- lowcost[minid]=;/* 标记节点minid加入生成树 */
- for(j=; j<node_num; j++)/* 更新当前节点minid到其他节点的权值 */
- {
- if(G[minid][j]<lowcost[j])/* 发现更小的权值 */
- {
- lowcost[j]=G[minid][j];/* 更新权值信息 */
- mst[j]=minid;/* 更新最小权值边的起点 */
- }
- }
- }
- return sum;/* 返回最小权值和 */
- }
- int main()
- {
- int i,j,w;
- for(i=; i<node_num; i++)
- for(j=; j<node_num; j++)
- {
- G[i][j]=G[j][i]=inf;/* 初始化图,所有节点间距离为无穷大 */
- }
- //读取城市信息
- freopen("city.txt","r",stdin);
- for(i=; i<node_num; i++)
- {
- scanf("%s",c[i].s);
- scanf("%d,",&c[i].id);
- }
- //读取各城市之间的距离(权值)
- freopen("distance.txt","r",stdin);
- for(i=; i<node_num; i++)
- for(j=; j<=i; j++)
- {
- scanf("%d",&w);
- if(w!=)
- G[i][j]=G[j][i]=w;
- }
- int sum=Prim();//求最小生成树
- printf("总长度:%d",sum);//输出最小权值和
- return ;
- }
Prim_v1.1
最小生成树Prim算法的更多相关文章
- 数据结构代码整理(线性表,栈,队列,串,二叉树,图的建立和遍历stl,最小生成树prim算法)。。持续更新中。。。
//归并排序递归方法实现 #include <iostream> #include <cstdio> using namespace std; #define maxn 100 ...
- 最小生成树Prim算法(邻接矩阵和邻接表)
最小生成树,普利姆算法. 简述算法: 先初始化一棵只有一个顶点的树,以这一顶点开始,找到它的最小权值,将这条边上的令一个顶点添加到树中 再从这棵树中的所有顶点中找到一个最小权值(而且权值的另一顶点不属 ...
- 最小生成树—prim算法
最小生成树prim算法实现 所谓生成树,就是n个点之间连成n-1条边的图形.而最小生成树,就是权值(两点间直线的值)之和的最小值. 首先,要用二维数组记录点和权值.如上图所示无向图: int map[ ...
- Highways POJ-1751 最小生成树 Prim算法
Highways POJ-1751 最小生成树 Prim算法 题意 有一个N个城市M条路的无向图,给你N个城市的坐标,然后现在该无向图已经有M条边了,问你还需要添加总长为多少的边能使得该无向图连通.输 ...
- SWUST OJ 1075 求最小生成树(Prim算法)
求最小生成树(Prim算法) 我对提示代码做了简要分析,提示代码大致写了以下几个内容 给了几个基础的工具,邻接表记录图的一个的结构体,记录Prim算法中最近的边的结构体,记录目标边的结构体(始末点,值 ...
- 图论算法(五)最小生成树Prim算法
最小生成树\(Prim\)算法 我们通常求最小生成树有两种常见的算法--\(Prim\)和\(Kruskal\)算法,今天先总结最小生成树概念和比较简单的\(Prim\)算法 Part 1:最小生成树 ...
- 最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析
最小生成树,Prim算法与Kruskal算法,408方向,思路与实现分析 最小生成树,老生常谈了,生活中也总会有各种各样的问题,在这里,我来带你一起分析一下这个算法的思路与实现的方式吧~~ 在考研中呢 ...
- 最小生成树——prim算法
prim算法是选取任意一个顶点作为树的一个节点,然后贪心的选取离这棵树最近的点,直到连上所有的点并且不够成环,它的时间复杂度为o(v^2) #include<iostream>#inclu ...
- 最小生成树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind
最小支撑树树--Prim算法,基于优先队列的Prim算法,Kruskal算法,Boruvka算法,“等价类”UnionFind 最小支撑树树 前几节中介绍的算法都是针对无权图的,本节将介绍带权图的最小 ...
- 求最小生成树(Prim算法)(1075)
Description 求出给定无向带权图的最小生成树.图的定点为字符型,权值为不超过100的整形.在提示中已经给出了部分代码,你只需要完善Prim算法即可. Input 第一行为图的顶点个数n ...
随机推荐
- MSSQL:修改tempdb设置增加DW性能
Temp DB 在DW中变得非常重要,因为要进行大量的运算,如果内存不够数据就会放在Temp DB中 1. 把Temp DB移动到高性能的磁盘上. 2. 增加tempdb 的大小 3. 把Auto S ...
- 腾讯云部署Flask应用
由于新浪云现在不免费了.而且云豆也用完了.所以去腾讯云申请了个学生云主机,一元一个月. 不过部署开发环境还是有点麻烦的,搞了好几天,终于部署成功了! 下面说部署过程: 我云主机用的是 Ubuntu 1 ...
- malloc/free和new/delete的区别汇总
一.基本概念 malloc/free 1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败,则返回 ...
- BZOJ 1997: [Hnoi2010]Planar( 2sat )
平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...
- printf参数的问题
根据前面的某一篇的文章,可以清楚的看到:对于每一个函数,通过这个函数的[ebp+x]就可以直接访问到它调用的时候传进来的形参的值,通过[ebp-x]就可以直接访问它的局部变量. 所以printf这个函 ...
- IO调度算法研究1
linux kernel 2.6之后提供了四种IO调度算法,每种调度算法都有其不同的特点和应用场景,系统使用者可以通过系统提供的接口,选择使用哪种IO调度算法,以及调整IO调度算法的参数,以达到最优的 ...
- 手工部署Sqlserver CLR程序集
原文 手工部署Sqlserver CLR程序集 以前一直用VS部署Sqlserver CLR程序集简单省事,现在服务器部署在内网了,必须手动更新部署Sqlserver CLR程序集. 开始以为A ...
- SqlServer2012导入Oracle详细案例
第一次使用SqlServer2012,界面和VS2012风格一致了,Great! 进入正题,这篇博文主要写一下自己亲测的一个案例,使用SqlServer2012的“导入和导出数据”功能向Oracle1 ...
- Android的重力传感器(3轴加速度传感器)简单实例
重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会 ...
- javaweb学习路之二--上传gitgub
代码上传github 代码上传到github的步骤 第一步:申请github账号 https://github.com/注册账号 第二步:登录github,新建repository仓库,命名,创建 第 ...