数据结构实验案例分享--医院选址问题
问题描述
医院选址问题:
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