问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

急!(最小生成树问题)请教高手!!

发布网友 发布时间:2022-05-29 07:47

我来回答

2个回答

热心网友 时间:2023-10-11 14:59

例子:
最小生成树问题
在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。
答:
用邻接矩阵表示的图的prim算法的源程序
*/#include<stdio.h>
#define MAXVEX 6
typedef char VexType;
typedef float AdjType;
typedef struct {
int n; /* 图的顶点个数 */
/*VexType vexs[MAXVEX]; 顶点信息 */
AdjType arcs[MAXVEX][MAXVEX]; /* 边信息 */
} GraphMatrix;
typedef struct{
int start_vex, stop_vex; /* 边的起点和终点 */
AdjType weight; /* 边的权 */
} Edge;
Edge mst[5];
#define MAX 1e+8
void prim(GraphMatrix * pgraph, Edge mst[]) {
int i, j, min, vx, vy;
float weight, minweight; Edge edge;
for (i = 0; i < pgraph->n-1; i++) {
mst[i].start_vex = 0;
mst[i].stop_vex = i+1;
mst[i].weight = pgraph->arcs[0][i+1];
}
for (i = 0; i < pgraph->n-1; i++) { /* 共n-1条边 */
minweight = MAX; min = i;
for (j = i; j < pgraph->n-1; j++)/* 从所有边(vx,vy)(vx∈U,vy∈V-U)中选出最短的边 */
if(mst[j].weight < minweight) {
minweight = mst[j].weight;
min = j;
}
/* mst[min]是最短的边(vx,vy)(vx∈U, vy∈V-U),将mst[min]加入最小生成树 */
edge = mst[min];
mst[min] = mst[i];
mst[i] = edge;
vx = mst[i].stop_vex; /* vx为刚加入最小生成树的顶点的下标 */

for(j = i+1; j < pgraph->n-1; j++) { /* 调整mst[i+1]到mst[n-1] */
vy=mst[j].stop_vex; weight = pgraph->arcs[vx][vy];
if (weight < mst[j].weight) {
mst[j].weight = weight;
mst[j].start_vex = vx;
}
}
}
}
GraphMatrix graph = {
6,
,
,
,
,
,

}
};
int main(){
int i;
prim(&graph,mst);
for (i = 0; i < graph.n-1; i++)
printf("(%d %d %.0f)\n", mst[i].start_vex,
mst[i].stop_vex, mst[i].weight);
return 0;
}

热心网友 时间:2023-10-11 15:00

快排快啊。。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct road
{
int st;
int ed;
int w;
};
road all[900];
int A[30];
int cmp(const void *a,const void *b)
{
return (*(road *)a).w - (*(road *)b).w;
}
int find(int x)
{
if (x != A[x])
A[x] = find(A[x]);
return A[x];
}
int main()
{
int i,j,k,q,p,m,n,sum;
char s,e;
while (scanf("%d",&n) != EOF)
{
if (n == 0) break;
memset(A,0,sizeof(int));
for (i = 1;i <= n;i++)
A[i] = i;
m = 0;
for (i = 1;i < n;i++)
{
scanf(" %c%d",&s,&p);
while (p--)
{
scanf(" %c%d",&e,&q);
all[m].st = s - 'A';
all[m].ed = e - 'A';
all[m].w = q;
m++;
}
}
qsort(all,m,sizeof(all[0]),cmp);
k = 0;sum = 0;
while (k < m)
{
all[k].st = find(all[k].st);
all[k].ed = find(all[k].ed);
if (all[k].st != all[k].ed)
{
sum += all[k].w;
A[all[k].st] = all[k].ed;
}
k++;
}
printf("%d\n",sum);
}
system("pause");
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
洛阳火车站到洛阳关林的钢厂怎么坐公车去?钢厂目前是否分为三个小... 李永昌的《桃花运》 歌词 失眠特效药有哪些 失眠有什么快速特效药 长期失眠用什么药最好?失眠治疗特效药有哪些 失眠怎么办办,有没有什么特效药 本人严重失眠,有特效药吗? 长期焦虑失眠怎么办?有没有好的特效药? 离婚了,小孩抚养费对方拖着不给,玩失踪,怎么办? 小孩抚养费前夫每月都拖着不给怎么解决 天津市南开区赛博数码广场b112 这家戴尔店靠谱吗 秋葵日式土豆泥需要用到哪些方法做出来更美味? .[简答题] 运用kruskal算法求出下面网络的最小生成树 &#xFFFC; 以下哪些属于企业战略的特点?/ 已知一个如图所示的带权网络图,使用克鲁斯卡尔算法构造该图的最小生成树 机会网络中路由用到最小生成树吗 最小生成树在n个城市之间建设网络,只需保证连通即可,求最经济的架设方法。存储结构采用多种求解算法多种 如何根据网络邻接矩阵,画出一棵最小生成树,求解答分析过程,要比较详细,最好截图。 第(2)小题。 高一语文课文中的相信未来一课,诗题“相信未来”有几层含义?请结合诗歌作简要说明。要简短扼要的。 最小生成树 C语言算法求解:对任意给定的网络(顶点数和边数自定),设计算法生成它的最小生成树。 简单解释一下什么叫最小生成树和权值,快 啊啊啊啊啊,创新声卡和动圈麦天津河西哪里有卖 请构造下图所示网络最小生成树 天津哪有卖外置声卡的 田边小河边红梅花儿开是什么歌的歌词 苏联老歌,里头有一句红梅花儿开少女的思念一点没咸少,这歌叫哈明 是否还能想起此刻的相爱 ,青春不复返,时间不在回 歌词是哪首歌曲? 天天酷跑最早的四连跳都人物是谁 绍兴富盛镇距离江西省景德镇高新区多少公里 在&quot;相信未来&quot;中用孩子的笔体写下&quot;,有什么含义?三次&quot;写下:相信未来&quot;有什么变化?表达了诗人怎样的思想感... 请问日式的土豆泥怎么做才好吃! 浙教版高一语文必背文言文和古诗如果是节选的请注明下 55年转业,工资72元是啥级别? 1955年中国的1000元和现在的钱有什么区别 1955年行政级别3级的工资是多少钱 无锡钳工证 怎么样从朋友那里获取另一个为朋友的? 我在无锡钳工及铣床磨床工作了6年,如何考取职业资格证书。 如何获得微信里朋友的 我想要加一个朋友的微信,都是我不知道他的和手机号,怎样才能加呢? 我学的是钳工 现在打算 去江苏 无锡 那里 学些钳工的技术,去那里怎么样 怎么加朋友 无锡市想考维修电工的技师和高级技师去哪里报名?职业资格证书 怎样加朋友的 怎么找回朋友的 华为navo6闹钟怎么调都是响几秒就不响了怎么回事? 华为4,不知道为什么早上闹钟是响啦几下就自己关闭,过啦几分钟又重复。 冬天脚为什么会裂 一个手机两个怎么加另一个微信的朋友- 问一问