#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. “System.Threading.ThreadAbortException”类型的第一次机会异常在 mscorlib.dll 中发

    问题原因: Thread.Abort 方法 .NET Framework 4  其他版本   1(共 1)对本文的评价是有帮助 - 评价此主题 在调用此方法的线程上引发 ThreadAbortExce ...

  2. [转] C中的位域

    一.位域 有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一 ...

  3. xlistview的(java)

    package com.bwie.xlistviews; import java.text.SimpleDateFormat;import java.util.Date; import com.bwi ...

  4. windows命令行及批处理文件小结

    1.命令Shell概述(Command shell overview): The command shell is a separate software program that provides ...

  5. CentOS中配置LNMP环境打开提示File not found

    在centos系统中配置好php环境了,但是发现能运行html页面并不能运行php文件了,这样我就在gg的帮助下一步不解决了,下面来看问题的具体解决过程.     安装之后测试发现,怎么Html能运行 ...

  6. 自动获取UILabel的宽度高度

    在使用UILabel存放字符串时,经常需要获取label的长宽数据,本文列出了部分常用的计算方法. 1.获取宽度,获取字符串不折行单行显示时所需要的长度 CGSize titleSize = [aSt ...

  7. 转载 javascript中的正则表达式总结 二

    学习正则表达式 今年的第一篇javascript文章就是这个正则表达式了,之前的文章是转载别人的,不算自己的东西,可以忽略不计,最近突然想把转载别人的东西 统统删掉,因为转载过的文章,我根本没有从中获 ...

  8. BZOJ 4562 食物链

    我们需要拓扑一下. #include<iostream> #include<cstring> #include<cstdio> #include<algori ...

  9. HDU5437 Alisha’s Party 优先队列

    点击打开链接 可能出现的问题: 1.当门外人数不足p人时没有判断队列非空,导致RE. 2.在m次开门之后最后进来到一批人没有入队. 3.给定的开门时间可能是打乱的,需要进行排序. #include&l ...

  10. 简单的多线程(活用OD解决运行时错误)

    代码源自<VC++深入详解>第15章 “多线程”,位于第563页 - 566 页. 程序的目的是展示多线程运行的效果: #include <windows.h> #includ ...