c 语言寻找最小生成树,求助,关于求无向图的最小生成树代码
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
#include
#include
#include
#define INFINITY 30000//权值最大值
#define max_vertex_num 20//最大顶点数
typedef struct{
int arcs[max_vertex_num][max_vertex_num]; //邻接矩阵
int vexnum,arnum;//图当前的顶点和边数
}Graph;
typedef struct{
int adjvex;//某顶点与已构造好部分生成树的顶点之间权值最小的顶点
int lowcost;//某顶点与已构造好部分生成树的顶点之间的最小权值
}ClosEdge;//用prim算法求最小生成树的辅助数组
void CreateGraph(Graph g)//生成邻接矩阵
{
int i,j;
int start,end,weight;
for(i=1;i<=g.vexnum;i++)
for(j=1;j<=g.vexnum;j++)
g.arcs[i][j]=INFINITY;//矩阵初始化
printf("输入每条边的两个关联顶点编号和其权值:\n");
for(i=1;i<=g.arnum;i++)
{
scanf("%d %d %d",&start,&end,&weight);
g.arcs[start][end]=weight;
g.arcs[end][start]=weight;
}
}
int minimun(ClosEdge cl[],int vnum)//在辅助数组中选择权值最小的顶点并返回其位置
{
int i;
int w,p;
w=INFINITY;
for(i=1;i<=vnum;i++)
{
if(cl[i].lowcost!=0&&cl[i].lowcost
{
w=cl[i].lowcost;
p=i;
}
}
return p;
}
void MiniSpanTree_PRIM(Graph g,int u)
{
ClosEdge closedge[max_vertex_num];
int i,j,k;
printf("最小生成树:\n");
for(j=1;j<=g.vexnum;j++)//辅助数组初始化
{
if(j!=u)
{
closedge[j].adjvex=u;
closedge[j].lowcost=g.arcs[u][j];
}
}
closedge[u].lowcost=0;//初始,U={u} ;
for(i=1;i
{
k=minimun(closedge,g.vexnum);//求生成树的下一个顶点
printf("%d %d\n",closedge[k].adjvex,k);
closedge[k].lowcost=0;//第k个顶点并入U集
for(j=1;j<=g.vexnum;j++)//新顶点并入后重新选择最小边
{
if(g.arcs[k][j]
{
closedge[j].adjvex=k;
closedge[j].lowcost=g.arcs[k][j];
}
}
}
}
int main()
{
Graph g;
char jx='y';
int u;
while(jx!='N'&&jx!='n')
{
printf("请输入图的顶点和边数:\n");
scanf("%d %d",&g.vexnum,&g.arnum);
CreateGraph(g);
printf("请输入构造最小生成树的开始顶点:\n");
scanf("%d",&u);
MiniSpanTree_PRIM(g,u);
printf("最小生成树构造完毕,继续进行吗?\n");
scanf("%c",&jx);
}
return 0;
}
c 语言寻找最小生成树,求助,关于求无向图的最小生成树代码相关推荐
- python求m和n之间的所有素数_C语言求助,《求m和n之间的所有素数》
题目: C语言求助,<求m和n之间的所有素数> [问题描述] 输入两个正整数m和n(m≥1,n≤500),输出m和n之间的所有素数,每行输出6个。素数是指只能被1和自身整除的正整数,最小的 ...
- c语言分母多项乘积怎么算,C++编程 用梯形求积公式求解定积分∫3lnxdx积分区间为(1,2, C语言,用梯形法编程求定积分x^3+x/2+1的值...
问题标题 C++编程 用梯形求积公式求解定积分∫3lnxdx积分区间为(1,2, C语言,用梯形法编程求定积分x^3+x/2+1的值 2019-8-16来自ip:15.179.13.64的网友咨询 浏 ...
- C语言输入一个任意数求各位数的和
C语言输入一个任意数求各位数的和 int main(void) {int x, r, s = 0;scanf("%d", &x);while (x>0){r = x ...
- 怎么证明权重不相同的加权无向图的最小生成树是唯一的 (图论)
转自:https://blog.csdn.net/liangzhaoyang1/article/details/51602926 设G是所有边权均不相同的无向联通图. 证明一: 首先,易证图G中权值最 ...
- C语言使用1到9求出所有k个数字的所有组合的算法(附完整源码)
C语言使用1到9求出所有k个数字的所有组合的算法 C语言使用1到9求出所有k个数字的所有组合的算法完整源码(定义,实现,main函数测试) C语言使用1到9求出所有k个数字的所有组合的算法完整源码(定 ...
- 对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的边。说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
对下图所示的连通网络G,用克鲁斯卡尔(Kruskal)算法求G的最小生成树T,请写出在算法执行过程中,依次加入T的边集TE中的 边.说明该算法的基本思想及贪心策略,并简要分析算法的时间复杂度
- 并查集与贪心算法的应用之求解无向图的最小生成树
一,介绍 本文介绍使用Kruskal算法求解无向图的最小生成树.Kruskal是一个贪心算法,并且使用了并查集这种数据结构. 关于并查集的介绍,参考:数据结构--并查集的原理及实现 二,构造一个无向图 ...
- (篇四)C语言静态变量法,求各阶乘,的和
文章目录 静态变量求阶乘相加 普通方法求阶乘相加 本篇仍然是C语言的相关知识,主要分析了用C语言的静态变量来求各个阶乘的和:当然也包括了阶乘和静态变量的相关分析 静态变量求阶乘相加 1.阶乘的概念: ...
- matlab求灰度图像梯度,[求助]如何求图像的梯度
[求助]如何求图像的梯度 书上举例灰度图像: a = 0 0 0 100 100 0 0 0 100 100 0 0 0 100 100 100 100 100 100 100 100 100 100 ...
最新文章
- 【专家观点】张亚勤、张宏江:人工智能的未来是什么?
- Java 正则表达式中为什么反斜杠“\“需要用“\\\\”表示
- python3 的 str bytes 区别
- mysql vfp_vfp+mysql问题|交流区 - 梅子Visual FoxPro 编程 - Powered by phpwind
- 系统架构师学习笔记-多媒体基础知识
- springboot- jsp访问404的问题解决
- html5音乐播放时间监测,【HTML5】HTML5中video元素事件详解(实时监测当前播放时间)...
- Android开发笔记(三十九)Activity的生命周期
- echarts实现svg地图
- 【转】ubuntu12.04完美安装QQ2012、QQMusic、Foxmail等--wine
- python实现元胞自动机
- 源码编辑器怎么编出游戏_编辑游戏
- mousewheel事件
- C.I.刘易斯的学术之路--- 刘易斯逻辑之十二尾篇
- 计算机无法识别佳能5d2,佳能相机连接后电脑显示无法识别
- django读取mysql事实数据_Django读取Mysql数据并显示在前端的实例
- CAD设置超链接(网页版)
- 上海最新住房贷款(含公积金贷款,商业贷款,组合贷款)
- AR+教育:ALVA SYSTEMS把图书馆做成了4D百科全书
- 2021年中国工业和商业LED照明市场趋势报告、技术动态创新及2027年市场预测