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

、构造可以使n个城市连接的最小生成树 给定一个地区的n个城市间的距离网,采用邻接矩阵表示,用Prim算法建

发布网友 发布时间:2023-03-27 14:10

我来回答

1个回答

热心网友 时间:2023-10-24 01:47

将城市看成是点,城市之间的距离看成是点之间的权值。
下面是PRIM算法实现的最小生成树代码。,利用邻接矩阵存储边的信息。程序已通过编译了,可以直接运行。
#include <stdio.h>
#include <string.h>
typedef int VRType;
typedef char InfoType;
#define MAX_NAME 3
/*顶点字符串的最大长度+1*/
#define MAX_INFO 20
/*相关信息字符串的最大长度+1*/
typedef char VertexType[MAX_NAME];
#define INFINITY 32767
/*用整型最大值代替无穷大*/
#define MAX_VERTEX_NUM 20
/*最大顶点个数*/
typedef enum{DG,DN,AG,AN} GraphKind;
/*{有向图,有向网,无向图,无向网}*/
typedef int PathMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef int ShortPathTable[MAX_VERTEX_NUM];
typedef struct
{
VRType adj;
/*顶点关系类型。对无权图,用1(是)或0(否)表示相邻否*/
/*对带全图,则为权值类型*/
InfoType *info;
/*该弧相关信息的指针(可无)*/
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct
{
VertexType vexs[MAX_VERTEX_NUM];
/*顶点向量*/
AdjMatrix arcs;
/*邻接矩阵*/
int vexnum,arcnum;
/*图的当前顶点数和弧数*/
GraphKind kind;
/*图的种类标志*/
}MGraph;
int LocateVex(MGraph G,VertexType u)
{ /*初始条件:图G存在,u和G中顶点有相同特征*/
/*操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1*/
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G.vexs[i])==0)
return i;
return -1;
}
int CreateAN(MGraph *G)
{/*采用数组(邻接矩阵)表示法,构造无向网G*/
int i,j,k,w,IncInfo;
char s[MAX_INFO],*info;
VertexType va,vb;
printf("please input number of acmes and arcs in G,and there is some information in arc,if yes is 1,else is 0:");
scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncInfo);
printf("please input the value of %d acmes(<%d character):\n",(*G).vexnum,MAX_NAME);
for(i=0;i<(*G).vexnum;++i)
/*构造顶点向量*/
scanf("%s",(*G).vexs[i]);
for(i=0;i<(*G).vexnum;++i)
/*初始化邻接矩阵*/
for(j=0;j<(*G).vexnum;++j)
{(*G).arcs[i][j].adj=INFINITY;
/*网*/
(*G).arcs[i][j].info=NULL;
}
printf("please input %d the first and the second of acr and weigh:\n",(*G).arcnum);
for(k=0;k<(*G).arcnum;++k)
{
scanf("%s %s %d",va,vb,&w);
/*%*c吃掉回车符*/
i=LocateVex(*G,va);
j=LocateVex(*G,vb);
(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w;
/*无向*/
if(IncInfo)
{
printf("please input some information about the arc(<%d character): ",MAX_INFO);
gets(s);
w=strlen(s);
if(w)
{
info=(char*)malloc((w+1)*sizeof(char));
strcpy(info,s);
(*G).arcs[i][j].info=(*G).arcs[j][i].info=info;
/*无向*/
}
}
}
(*G).kind=DN;
return 1;
}
typedef struct
{/*记录从顶点集U到V-U的代价最小的边的辅助数组定义*/
VertexType adjvex;
VRType lowcost;
}minside[MAX_VERTEX_NUM];
int mininum(minside SZ,MGraph G)
{/*求closedege,lowcost的最小正值*/
int i=0,j,k,min;
while(!SZ[i].lowcost)
i++;
min=SZ[i].lowcost;
k=i;
for(j=i+1;j<G.vexnum;j++)
if(SZ[j].lowcost>0)
if(min>SZ[j].lowcost)
{
min=SZ[j].lowcost;
k=j;
}
return k;
}
void MiniSpanTree_PRIM(MGraph G,VertexType u)
{/*用普利姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边*/
int i,j,k;
minside closedge;
k=LocateVex(G,u);
for(j=0;j<G.vexnum;++j)
/*辅助数组初始化*/
{
if(j!=k)
{ strcpy(closedge[j].adjvex,u);
closedge[j].lowcost=G.arcs[k][j].adj;
}
}
closedge[k].lowcost=0;
/*初始U={n}*/
printf("zuixiaodaijiashengchengshudegetiaobianwei:\n");
for(i=1;i<G.vexnum;++i)
{/*选择其余G.vexnum-1个顶点*/
k=mininum(closedge,G);
/*求出T的下一个结点:第K顶点*/
printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]);
/*输出生成树的边*/
closedge[k].lowcost=0;
/*第K顶点并入U集*/
for(j=0;j<G.vexnum;++j)
if(G.arcs[k][j].adj<closedge[j].lowcost)
{/*新顶点并入U集后重新选择最小边*/
strcpy(closedge[j].adjvex,G.vexs[k]);
closedge[j].lowcost=G.arcs[k][j].adj;
}
}
}
void main()
{
MGraph G;
CreateAN(&G);
MiniSpanTree_PRIM(G,G.vexs[0]);
getch();
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 prim能画立体图吗 中国早餐种类有哪些? 中国六种传统早餐,你吃过几种? 中式早餐种类有哪些 最火的中国早餐都有啥 中国人寿六六传家保险一年交2万,连续交三年,多久能取出本金 国寿鑫禧宝年金保险尊享版每年交2万,交3年是什么保险 QQ三国装备四象怎么搭配? qq三国装备四象属性搭配 注销后绑定的银行卡会解绑吗? 微信支付提示需绑定银行卡,过几天自动解不? 本科三批录退的时间就是本科三批发放录取通知书的时间吗?查询本科三批录取结果一般是在出结果的第一天 高考录取中,退档与退录有什么区别吗? 使用dreamweaver8.0作网业,如下图关于div标签的问题,请高手帮忙,谢谢! 山东省成人高考录取退档是什么意思? 本科一批录退是什么意思 我在制作网页时增加了一个层&lt;div&gt;&lt;&#47;div&gt;可是网页上显示错误,错误提示是标记为非法因为这是一个交跌的.... 高职专科批非定向志愿录退什么意思 TAB标签错误 div错误是什么意思 谁知道什么叫录后退“啊? prim算法中,closedge[j].lowcost 是干什么用的。新定点并入U后重新选择最小边。那段代码没看懂。 辅助 香港无线(TVB)的哪些电视剧值得回味? tvb有哪些电视剧是经典? 成都教资领证通知单怎么下载 请问教师资格证的申请流程是什么啊? 11月7是什么日子?历史上11月7日的大事件? 公历11月7日8日是什么日子 11月7日---什么节? 生产加工的机器都有镭雕吗 国际商务人员工作职责是什么? 阿尔法2.0和破2的区别 耐克阿尔法2代莆田鞋怎么样 榆木家具如何上色 榆木家具刷的漆,分几种,怎么刷? 榆木家具如何上漆? 榆木喷什么颜色的漆 榆木家具油漆工序 宜章高还是莽山水库高 宜章莽山水库离韶关多远 长沙到宜江县莽山水库高速怎么走