数据结构案例经验分享--医院选址问题(C语言实现)

本文介绍了使用C语言解决医院选址问题,通过有向图表示村庄间交通,并应用Floyd算法。在实现过程中,作者遇到了VexName初始化错误和AM_Graph参数传递失败的问题,经过调试解决了问题。最终代码运行成功,达到了预期效果。
摘要由CSDN通过智能技术生成

问题描述

医院选址问题:
n个村庄之间的交通图可以用有向网图来表(下图中的有向图便可当做一个村庄距离示意图),图中边<v_i,v_j>上的权值表示从村庄i到村庄j的道路长度。现在要从这n个村庄中选择一个村庄新建一所医院,问这所医院应建在哪个村庄,才能使所有的村庄离医院都比较近?

村庄位置示意图

我想到的是这里应该用图的Floyd算法较为简单。
具体代码放在最后,这里我先展示以下我遇到的问题:

问题罗列

VexName初始化出现问题

typedef struct AM_Graph//图的邻接矩阵类型
{
   
	int AdjMatrix[N][N];//邻接矩阵存放各点之间的距离
	int VexNum,ArcNum;//存放顶点数量和弧的数量
    char VexName[N];//顶点名称
}AM_Graph;

但main函数中若是如此描述便会出错:

AM_Graph g;
g.VexName={
   ‘a','b','c','e','f'}

会显示
error C2059: syntax error : ‘{’;
error C2143: syntax error : missing ‘;’ before ‘{’;
error C2143: syntax error : missing ‘;’ before ‘}’;

出现此问题的原因是:

g.VexName={
   ***}

这样的命名方式只能用在初始化的时候使用,即变量建立+赋值=初始化,由于我们第一行

AM_Graph g;

已经建立了一个图,g.VexName 同样也有了定义,这时候便已经不再是初始化了,接下来只能通过一个一个调用,而不能通过整体为每个字符赋值了,如:

g.VexName[0]='a';
g.VexName[1]='b';
...

AM_Graph参数传递不成功的问题

我本来的设想是设定两个函数,一个建立图,一个实现Floyd算法,初始代码如下:

void BuildGraph(AM_Graph g,int a[N][N])
{
   
	int i,j;
	int count=0;//记录边的数量,方法是初始的矩阵所有不是0也不是MAX的元素个数可视为一条边

	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
		{
   
			if((a[i][j]!=0)&&(a[i][j]!=MAX))
				count++;//记录边的个数
			g.AdjMatrix[i][j]=a[i][j];//用传递的二维数组为图的邻接矩阵赋值
		}
	g.VexNum=N;//为图的各项元素赋值
	g.ArcNum=count;
	printGraph(g);//输出图的各项信息,以检验是否赋值成功
}

void Floyd(AM_Graph g,int Dist[N][N])//Floyd算法求解各顶点之间的最短距离
{
   
	int i,j,k;
	printf("=================1====================\n");

	for(i=0;i<N;i++)
		for(j=0;j<N;j++)
		{
   
		  Dist[i][j] = g.AdjMatrix[i][j];//Dist矩阵的初始值即为邻接矩阵的各项元素
		}
	printf("=================2====================\n");
	printGraph(g);


	for(k=0;k<N;k++)//用图中的每一点作为中间点遍历dist矩阵
	{
   
		for(i=0;i<N;i++)
		{
   
			for(j=0;j
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值