Prim求解最小生成树
#include "ljjz.h" typedef struct edgedata /*用于保存最小生成树的边类型定义*/
{ int beg,en; /*beg,en是边顶点序号*/
int length; /*边长*/
}edge; /*函数功能:prim算法构造最小生成树
函数参数:图的邻接矩阵g;边向量edge
*/
void prim(Mgraph g, edge tree[M-])
{ edge x;
int d,min,j,k,s,v; /* 建立初始入选点,并初始化生成树边集tree*/
for(v=;v<=g.n-;v++)
{
tree[v-].beg=;
tree[v-].en=v;
tree[v-].length=g.edges[][v];
} /*依次求当前(第k条)最小两栖边,并加入TE*/
for(k=;k<=g.n-;k++)
{
min=tree[k].length;
s=k;
for(j=k+;j<=g.n-;j++)
if(tree[j].length<min)
{
min=tree[j].length;
s=j;
}
v=tree[s].en;
x=tree[s];
tree[s]=tree[k];
tree[k]=x; /*由于新顶点v的加入,修改两栖边的基本信息*/
for(j=k+;j<=g.n-;j++)
{
d=g.edges[v][tree[j].en];
if(d<tree[j].length)
{
tree[j].length=d;
tree[j].beg=v;
}
}
}
/*输出最小生成树*/
printf("\n最小生成树是:\n");/*输出最小生成树*/
for (j=;j<=g.n-;j++)
printf("\n%c---%c %d\n",g.vexs[tree[j].beg],g.vexs[tree[j].en],tree[j].length);
printf("\n最小生成树的根是: %c\n", g.vexs[]);
} int main()
{
Mgraph g;
edge tree[M-]; /*用于存放最小生成树的M-1条边*/
creat(&g,"g.txt",); /*创建无向图的邻接矩阵*/
prim(g,tree); /*求解图的最小生成树*/
return ; }
/********************************************/
/* 邻接矩阵类型定义的头文件 */
/* 文件名:ljjz.h */
/********************************************/ #include <stdio.h>
#define FINITY 5000 /*此处用5000代表无穷大*/
#define M 20 /*最大顶点数*/
typedef char vertextype; /*顶点值类型*/
typedef int edgetype; /*权值类型*/
typedef struct{
vertextype vexs[M]; /*顶点信息域*/
edgetype edges[M][M]; /*邻接矩阵*/
int n,e; /*图中顶点总数与边数*/
} Mgraph; /*邻接矩阵表示的图类型*/
/* 函数功能:建立图的邻接矩阵存储结构
函数参数:邻接矩阵的指针变量g;存放图信息的文件名s;图的类型c,c=0表示建立无向图,否则表示建立有向图
函数返回值:无
*/
void creat(Mgraph *g,char *s ,int c)
{int i,j,k,w; /*建立网络的邻接矩阵存储结构*/
FILE *rf ;
rf = fopen(s, "r") ; /*从文件中读取图的边信息*/
if (rf)
{
fscanf(rf,"%d%d",&g->n,&g->e); /*读入图的顶点数与边数*/
for(i=;i<g->n;i++) /*读入图中的顶点值*/
fscanf(rf,"%1s",&g->vexs[i]); for(i=;i<g->n;i++) /*初始化邻接矩阵*/
for(j=;j<g->n;j++)
if (i==j) g->edges[i][j]=;
else g->edges[i][j]=FINITY; for (k=;k<g->e;k++) /*读入网络中的边*/
{fscanf(rf,"%d%d%d", &i,&j,&w);
g->edges[i][j]=w;
if (c==) g->edges[j][i]=w; /*如果C==0则建立无向图邻接矩阵,否则建立有向图邻矩阵*/
}
fclose(rf);
}
else g->n=;
} void print(Mgraph g)
{/*辅助函数,输出邻接矩阵表示的图g*/
int i,j; for (i=;i<g.n;i++)
{ printf("%c ",g.vexs[i]);
}
printf("\n");
for (i=;i<g.n;i++)
{ for (j=;j<g.n;j++)
{printf("%6d",g.edges[i][j]);
}
printf("\n");
}
}
Prim求解最小生成树的更多相关文章
- 破圈法求解最小生成树c语言实现(已验证)
破圈法求解最小生成树c语言实现(已验证) 下面是算法伪代码,每一个算法都取一个图作为输入,并返回一个边集T. 对该算法,证明T是一棵最小生成树,或者证明T不是一棵最小生成树.此外,对于每个算法,无论它 ...
- 6)图[2]Prim算法[最小生成树]
Prim 算法 求解方法: 首先将所指定的起点作为已选顶点,然后反复在满足如下条件下的边中选择一条最小边,直到 所有顶点已成为已选顶点为止(选择n-1条边). #include "iostr ...
- Prim Algoritm(最小生成树)
Prim Algorithm.这个算法可以分为下面几个步骤: 将顶点集V分成两个集合A和B,其中集合A表示目前已经在MST中的顶点,而集合B则表示目前不在MST中的顶点. 在B寻找与集合A连通的最短的 ...
- Prim算法---最小生成树
最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...
- POJ 1258 Agri-Net(Prim求最小生成树)
Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 64912 Accepted: 26854 Descri ...
- 图——图的Prim法最小生成树实现
1,运营商的挑战: 1,在下图标出的城市间架设一条通信线路: 2,要求: 1,任意两个城市间都能够通信: 2,将架设成本降至最低: 2,问题抽象: 1,如何在图中选择 n - 1 条边使得 n 个顶点 ...
- [讲解]prim算法<最小生成树>
最小生成树的方法一般比较常用的就是kruskal和prim算法 一个是按边从小到大加,一个是按点从小到大加,两个方法都是比较常用的,都不是很难... kruskal算法在本文里我就不讲了,本文的重点是 ...
- Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)
题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...
- prim /kruskal 最小生成树
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #inc ...
随机推荐
- CSS 奇技淫巧十八招
http://www.tuicool.com/articles/VZneI3 開始覺得自己會寫 CSS 也算有一段時間了,常常遇到一些非常實用的技巧不斷地反覆使用,但是我個人覺得對初學者來說很難從 ...
- Fragment在xml中但作用不是显示view
2013-12-17 有时候会发现在xml文件中有使用fragment,但是却不是为了显示View,代码如下: <FrameLayout xmlns:android="http://s ...
- python 操作json
认识 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于JavaScript(Standard ECMA-262 3rd Edition - Dece ...
- Java注解配置
Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能.注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annota ...
- tomcat 详解
首先搞清楚几个概念:Servlet容器与web容器.Servlet容器的主要任务是管理servlet的生命周期,而web容器更准确的说应该叫web服务器,它是来管理和部署web应用的.还有一种服务器叫 ...
- Unity开发Android应用程序:调用安卓应用程序功能
开发环境: Eclipse3.4 + adt12 + jdk6 + AndroidSDK2.2 Unity3.4 + windows7 测试设备: HTC Desire HD 本文要涉及到的几个重点问 ...
- SharePoint 2013 开发——SharePoint APP介绍
博客地址:http://blog.csdn.net/FoxDave 新的APP模型让我们能够创建看起来像是SharePoint的一部分的应用程序,但是它完全运行在独立于SharePoint服务器 ...
- winform错误提示 :窗口类名无效(Window class name is not valid)
winfrom 程序在 xp 操作系统上报错提示 窗口类名无效(Window class name is not valid) 解决方法 注释 Program类 里 这句 Application.En ...
- iOS开发之单例设计模式(完整正确版本)
单例的意思从字面上就可以略知一二,所谓单例就是确保在程序运行过程中只创建一个对象实例.可以用于需要被多次广泛或者说多次使用的资源中,比如我们常见的网络请求类.工具类以及其它管理类等.比如我iOS开发中 ...
- JVM-class文件完全解析-常量池
在.java文件,讲过javac编译后产生的 .class文件中,头4个字节表示的是魔数,接着魔数后面的第5,6个字节存储的是次版本号,第7,8个字节存储的主板本号.那么再接下来的就是表示常量池入口了 ...