#include<stdio.h>
#include<ctype.h>
#define nMax 20 /*村庄的最大值(理论上没有限制,但为了控制问题的规模和手工输入的不便,故控制在20*/
#define WeighMax 65535 /*村庄之间距离的最大值,也是int型的最大值*/
int n; /*公共变量用于存放村庄的个数*/
int final[nMax]; /*用于存放距离最远的最好村庄情况*/
int Adj[nMax][nMax]; /*二维数组,用于存放村庄之间的初始距离*/
int ShortAdj[nMax][nMax]; /*二维数组,用于存放村庄之间的最短距离*/
void Floyd(); /*最核心的算法,弗络伊德算法O(n^3),用于计算村庄之间的最短距离*/
void Input_Output(); /*用于手工输入村庄之间距离,和输入相应数值的函数*/
void Out(); /*用于输出最终结果的函数*/
void ShortestPath(); /*计算离医院最远的村庄到医院的距离最短的函数,是对Floyd的后续处理*/
void main(){ /*主函数*/
Input_Output();
Floyd();
ShortestPath();
Out();
}
void Input_Output(){
int i,j;
printf("请输入村庄的数目(范围为2-50):");
scanf("%2d", &n);
while(n<=2||n>nMax){
printf("您的输入有误,请再次输入:"); /*根据空间复杂度,人为的限制手工输入的次数*/
scanf("%2d",&n);}
for(i=1; i<=n; i++){
for(j=1; j<=n; j++){
if(i==j) Adj[i][j] = ShortAdj[i][j] = 0; /*此算法只考虑有向图的情况,如果是无向图的话,for循环中i,j的值<=n/2*/
else{int PathWeigh = WeighMax; /*初始化输入的值为int型的最大值*/
printf("\n请输入从第%d个村庄到第%d个村庄的距离:", i, j);
scanf("%d",&PathWeigh); /*未能处理非数字输入的问题*/
if(PathWeigh>WeighMax) Adj[i][j]=WeighMax; /*如果输入比int型数值大,则取其上限*/
else Adj[i][j]=PathWeigh;
printf("村庄%d到村庄%d的距离是:%d\n", i, j, Adj[i][j]);
ShortAdj[i][j] = Adj[i][j];} /*同时将输入的值存到ShortAdj中,用于下面Floyd函数的处理中*/
}
}
printf("\n村庄之间路径的距离(矩阵):\n");
for(i=1;i<=n;i++){ /*输出手工输入的数值,以矩阵的方式来显示,更加直观*/
for(j=1;j<=n;j++) printf("\t%d",Adj[i][j]);
printf("\n");}
}
void Floyd(){ /*弗络伊德算法,求多源点的最短路径*/
int i,j,tmp;
for(tmp=1;tmp<=n;tmp++)
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){ /*三次循环*/
if(Adj[i][j]>ShortAdj[i][tmp]+ShortAdj[tmp][j]) /*如果通过中间路径,比原来存于数组里的值小,则代换!*/
ShortAdj[i][j]=ShortAdj[i][tmp]+ShortAdj[tmp][j];}
printf("\n村庄之间路径的最短距离(矩阵):\n");
for(i=1;i<=n;i++){ /*打印村庄之间的最短路径,同样以矩阵的形式显示*/
for(j=1;j<=n;j++) printf("\t%d",ShortAdj[i][j]);
printf("\n");}
}
void ShortestPath(){ /*计算离医院最远的村庄到医院的最短距离*/
int i,j;
for(i=1;i<=n;i++){ /*找出每一组最短距离中的最大值!*/
final[i]=ShortAdj[i][1];
for(j=2;j<=n;j++)
if(final[i]<ShortAdj[i][j]) final[i]=ShortAdj[i][j];
}
printf("\n村庄\t最长距离\n"); /*打印每组的最长距离*/
for(i=1;i<=n;i++)
printf("%d\t%d\n",i,final[i]);
}
void Out(){ /*计算最终结果,并输出*/
int i,tmp=1;
for(i=2;i<=n;i++)
if(final[tmp]>final[i]) tmp=i;
printf("\n建设医院的最佳位置是村庄%d\n",tmp);
}
Harlant
- 粉丝: 0
- 资源: 12
最新资源
- 基于matlab的模拟滤波器和数字滤波器设计, 基于matlab的模拟滤波器和数字滤波器设计,其中数字滤波器包扩IIR和FIR的低通、高通、带通、带阻四大类型,模拟滤波器包括巴特沃斯( Butterw
- 蓝搜网页版源码 - 蓝奏云网盘搜索引擎网站系统源码
- 基于单片机的厨房报警系统开题
- 煤矿开挖区的三维渗流仿真 煤矿开挖区模型 计算了渗流速度场以及结构的应力场
- C语言+C语言学习经典试题集
- 西门子变频器 SINAMICS STARTER V5.6 HF1 软件 STARTER V56 STARTERV56HF1 ISO 003
- ASIC设计经验经典总结
- 自适应迭代无迹卡尔曼滤波算法AIUKF 锂离子电池SOC估计 递推最小二乘法辩识电池参数 具有良好的鲁棒性,初值误差为30%,仍能快速收敛 采用马里兰大学公开数据集 DST工况
- 量子计算竞赛:公钥密码破解与气象、金融、生物化工领域应用
- 光伏PV三相并网逆变器MATLAB仿真,版本2015b 模型内容: 1.光伏+MPPT控制(boost+三相桥式逆变) 2.坐标变+锁相环+dq功率控制+解耦控制+电流内环电压外环控制+spwm调制
- 基于深度学习的瓷砖瑕疵检测系统设计
- 永磁同步电机矢量控制C代码 全部从项目中总结得到,采用的S-function模式仿真,与实际项目运行基本一致,可以直接复制代码移植到工程实践项目中去
- MySQL 5.7.43 免费的数据库
- 西门子smart 200 rtu方式通讯四台三菱E700变频器资料 硬件:smart plc.三菱E700变频器,mcgs触摸屏(电脑仿真也可) 功能:指针写法,通过modbus rtu方式,实现对
- uvm-users-guide-1.0
- AI for Science 论文解读合集(持续更新ing),论文,数据集,教程下载hyper.ai.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈