#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求解最小生成树的更多相关文章

  1. 破圈法求解最小生成树c语言实现(已验证)

    破圈法求解最小生成树c语言实现(已验证) 下面是算法伪代码,每一个算法都取一个图作为输入,并返回一个边集T. 对该算法,证明T是一棵最小生成树,或者证明T不是一棵最小生成树.此外,对于每个算法,无论它 ...

  2. 6)图[2]Prim算法[最小生成树]

    Prim 算法 求解方法: 首先将所指定的起点作为已选顶点,然后反复在满足如下条件下的边中选择一条最小边,直到 所有顶点已成为已选顶点为止(选择n-1条边). #include "iostr ...

  3. Prim Algoritm(最小生成树)

    Prim Algorithm.这个算法可以分为下面几个步骤: 将顶点集V分成两个集合A和B,其中集合A表示目前已经在MST中的顶点,而集合B则表示目前不在MST中的顶点. 在B寻找与集合A连通的最短的 ...

  4. Prim算法---最小生成树

    最小生成树的Prim算法也是贪心算法的一大经典应用.Prim算法的特点是时刻维护一棵树,算法不断加边,加的过程始终是一棵树. Prim算法过程: 一条边一条边地加, 维护一棵树. 初始 E = {}空 ...

  5. POJ 1258 Agri-Net(Prim求最小生成树)

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 64912   Accepted: 26854 Descri ...

  6. 图——图的Prim法最小生成树实现

    1,运营商的挑战: 1,在下图标出的城市间架设一条通信线路: 2,要求: 1,任意两个城市间都能够通信: 2,将架设成本降至最低: 2,问题抽象: 1,如何在图中选择 n - 1 条边使得 n 个顶点 ...

  7. [讲解]prim算法<最小生成树>

    最小生成树的方法一般比较常用的就是kruskal和prim算法 一个是按边从小到大加,一个是按点从小到大加,两个方法都是比较常用的,都不是很难... kruskal算法在本文里我就不讲了,本文的重点是 ...

  8. Codeforces 632F - Magic Matrix(暴力 bitset or Prim 求最小生成树+最小瓶颈路)

    题面传送门 开始挖老祖宗(ycx)留下来的东西.jpg 本来想水一道紫题作为 AC 的第 500 道紫题的,结果发现点开了道神题. 首先先讲一个我想出来的暴力做法.条件一和条件二直接扫一遍判断掉.先将 ...

  9. prim /kruskal 最小生成树

    #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #inc ...

随机推荐

  1. C-指针与引用的区别

    1. 指针是一个变量,保存一个地址,指向内存中的一个单元.而引用是一个别名. int a = 1; int* p = &a; int b = 1; int& r = b; 2. 指针可 ...

  2. [安卓]AndroidManifest.xml文件简介及结构

    1.AndroidManifest.xml文件简介: 每个应用程序在它的根目录中都必须要有一个AndroidManifest.xml(名字须精确一致)文件.这个清单把应用程序的基本信息提交给Andro ...

  3. JVM-对象的存活与死亡

    当Java虚拟机进行垃圾收集的时候,那么它必须要先判断对象,是否还存活,如果存活就不能对它进行回收.所以判断一个对象是否存活是Java虚拟机必须要实现的. 1.对象是否存活 1)引用计数器:给对象添加 ...

  4. 【python】import 模块、包、第三方模块

    xx.py文件,称为模块(module),把不同模块归整到一起的文件夹,叫做包(package) 不同包下的模块可以重名,但是都不能和系统内建模块重名 包里面一定要有个__init__.py文件,否则 ...

  5. XCode之entitlement

    entitlement是codesign的一个输入,参见:codesign. entitlement的意思是权力,也就是表明应用所具有的权利,可以访问什么,不能访问什么等.这些信息会在codesign ...

  6. Android高薪之路-Android程序员面试宝典

    Android高薪之路-Android程序员面试宝典

  7. form表单select联动

    下拉列表:二级联动菜单 Select对象的常用属性 options[]:返回所有option组成的一个数组: name:名称 value:option的value的值 length:设置或读取opti ...

  8. Ubuntu 14.10 下运行进程实时监控pidstat命令详解

    简介 pidstat主要用于监控全部或指定进程占用系统资源的情况,如CPU,内存.设备IO.任务切换.线程等.pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上 ...

  9. Bayeux

    Bayeux是一种用来在客户端和服务器端传输低延迟的异步消息(主要通过http)的一种协议.它定义的消息通过命名通道进行路由并且能够进行交互传 送:server -> client, clien ...

  10. 12-27cell常用的属性

    1.创建cell //    创建一个cell并且设置cell的风格 UITableViewCell *cell  = [[UITableViewCell alloc]initWithStyle:UI ...