#include<stdio.h>
#include<string.h>
#define N 21
#define null 0x3f3f3f3f
int n=15, m;
int g[N][N];
typedef struct{
int num;
char *data;
}place;
place places[N];
int min(int k,int g)
{
return k<g? k:g;
}
void floyd()
{
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
int t = g[i][k] + g[k][j];
g[i][j]=min(g[i][j],t);
//if(t < g[i][j]) g[i][j] = t;
}
}
int main()
{
memset(g, null, sizeof g);
//初始化,假设两点之间路程无限远
for(int i = 1; i <= n; i ++) g[i][i] = 0;
//地点到自己本事距离为零
//char name[N]name="一食堂";
char name1[]="一食堂";
places[1].data=name1;
char name2[]="二食堂";
places[2].data=name2;
char name3[]="三食堂";
places[3].data=name3;
char name4[]="四食堂";
places[4].data=name4;
char name5[]="五食堂";
places[5].data=name5;
char name6[]="操场";
places[6].data=name6;
char name7[]="公教楼";
places[7].data=name7;
char name8[]="国培";
places[8].data=name8;
char name9[]="红馆";
places[9].data=name9;
char name10[]="白馆";
places[10].data=name10;
char name11[]="软件学院";
places[11].data=name11;
char name12[]="北门";
places[12].data=name12;
char name13[]="西门";
places[13].data=name13;
char name14[]="诚朴园";
places[14].data=name14;
char name15[]="启智园";
places[15].data=name15;
g[1][2]=1;
//eg.一食堂到二食堂距离为1;
g[2][3]=1;
g[3][4]=10;
g[4][5]=1;
g[5][6]=6;
g[6][7]=4;
g[7][8]=3;
g[8][9]=10;
g[9][10]=1;
g[10][11]=3;
g[11][12]=5;
g[12][13]=6;
g[13][14]=7;
g[14][15]=8;
for(int i=1;i<=14;i++)
g[i+1][i]=g[i][i+1];
//两点距离对称
g[4][6]=4;
g[6][4]=4;
g[11][15]=5;
g[15][11]=5;
g[1][13]=7;
g[13][1]=7;
g[14][6]=15;
g[6][14]=15;
//补充路径
floyd();
//floyd算法求最短路
int k;
printf("查询地点名称请输入1,查询两地之间最短距离请输入2\n");
scanf("%d",&k);
if(k==1)
{
printf("请输入查询的地点标号");
int num;
scanf("%d",&num);
printf("地点%d的名字叫作%s",num,places[num].data);
}
if(k==2)
{
int start,end;
printf("请输入出发的地点标号");
scanf("%d",&start);
printf("请输入结束的地点标号");
scanf("%d",&end);
printf("%s到%s的最短路径为%d米\n",places[start].data,places[end].data,g[start][end]);
}
return 0;
}
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define N 21
#define null 0x3f3f3f3f
int n=15, m;
int g[N][N];//路径矩阵
typedef struct{
int f;//去超市的频率
int num;//标号
char *data;//地点名称
char *imfomation;//简介
}place;
place places[N];
int min(int k,int g)
{
return k<g? k:g;
}
int max(int k,int g)
{
return k>g? k:g;
}
void floyd()
{
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
int t = g[i][k] + g[k][j];
g[i][j]=min(g[i][j],t);
//if(t < g[i][j]) g[i][j] = t;
}
}
void get_shop_place()
{
int Min=0x3f3f3f3f,Min_place=1;
for(int k = 1; k <= n; k ++)
{
int cnt=0;
for(int i = 1; i <= n; i ++)
{
if(k!=i)
{
cnt+=(g[i][k]*places[i].f);
}
}
printf("地点%d的名字叫作%s,该地点作为超市的距离的远近与频率为加权值为%d\n",k,places[k].data,cnt);
if(cnt<Min)
Min_place=k;
Min=min(Min,cnt);
}
printf("所以,最合适的超市位置为地点%d%s\n",Min_place,places[Min_place].data);
}
int main()
{
memset(g, null, sizeof g);
//初始化,假设两点之间路程无限远
for(int i = 1; i <= n; i ++) g[i][i] = 0;
//地点到自己本事距离为零
//char name[N]name="一食堂";
char name1[]="一食堂";
places[1].data=name1;
char name2[]="二食堂";
places[2].data=name2;
char name3[]="三食堂";
places[3].data=name3;
char name4[]="四食堂";
places[4].data=name4;
char name5[]="五食堂";
places[5].data=name5;
char name6[]="操场";
places[6].data=name6;
char name7[]="公教楼";
places[7].data=name7;
char name8[]="国培";
places[8].data=name8;
char name9[]="红馆";
places[9].data=name9;
char name10[]="白馆";
places[10].data=name10;
char name11[]="软件学院";
places[11].data=name11;
char name12[]="北门";
places[12].data=name12;
char name13[]="西门";
places[13].data=name13;
char name14[]="诚朴园";
places[14].data=name14;
char name15[]="启智园";
places[15].data=name15;
char imfomation1[]="一食堂饭菜便宜";
places[1].imfomation=imfomation1;
char imfomation2[]="二食堂脆皮鸡好吃";
places[2].imfomation=imfomation2;
char imfomation3[]="三食堂环境优美";
places[3].imfomation=imfomation3;
char imfomation4[]="四食堂性价高";
places[4].imfomation=imfomation4;
char imfomation5[]="五食堂花里胡哨";
places[5].imfomation=imfomation5;
char imfomation6[]="操场晚上有活动";
places[6].imfomation=imfomation6;
char imfomation7[]="公教楼学习圣地";
places[7].imfomation=imfomation7;
char imfomation8[]="国培吃喝玩乐";
places[8].imfomation=imfomation8;
char imfomation9[]="红馆打乒乓球";
places[9].imfomation=imfomation9;
char imfomation10[]="白馆打羽毛球";
places[10].imfomation=imfomation10;
char imfomation11[]="软件学院全是帅哥美女";
places[11].imfomation=imfomation11;
char imfomation12[]="北门川流不息";
places[12].imfomation=imfomation12;
char imfomation13[]="西门没有外卖";
places[13].imfomation=imfomation13;
char imfomation14[]="诚朴园人杰地灵";
places[14].imfomation=imfomation14;
char imfomation15[]="启智园举世无双";
places[15].imfomation=imfomation15;
for(int i = 1; i <= n; i ++)
{
int f=i*i%10;
places[i].num=i;
//设置标号
places[i].f=f;
//设置该地点去超市的频率
}
//places[14].f=10;
g[1][2]=1;
//eg.一食堂到二食堂距离为1;
g[2][3]=1;
g[3][4]=10;
g[4][5]=1;
g[5][6]=6;
g[6][7]=4;
g[7][8]=3;
g[8][9]=10;
g[9][10]=1;
g[10][11]=3;
g[11][12]=5;
g[12][13]=6;
g[13][14]=7;
g[14][15]=8;
for(int i=1;i<=14;i++)
g[i+1][i]=g[i][i+1];
//两点距离对称
g[4][6]=4;
g[6][4]=4;
g[11][15]=5;
g[15][11]=5;
g[1][13]=7;
g[13][1]=7;
g[14][6]=15;
g[6][14]=15;
//补充路径
floyd();
//floyd算法求最短路
int k;
printf("查询地点名称请输入1,查询两地之间最短距离请输入2,为超市选址,实现总体最优请输入3。\n");
scanf("%d",&k);
if(k==1)
{
printf("请输入查询的地点标号");
int num;
scanf("%d",&num);
printf("地点%d的名字叫作%s,该地点去超市的频率为%d\n",num,places[num].data,places[num].f);
printf("简介:%s\n",places[num].imfomation);
}
else if(k==2)
{
int start,end;
printf("请输入出发的地点标号");
scanf("%d",&start);
printf("请输入结束的地点标号");
scanf("%d",&end);
printf("%s到%s的最短路径为%d米\n",places[start].data,places[end].data,g[start][end]);
}
else if(k==3)
{
get_shop_place();
}
else
{
printf("输入有误!!!");
}
getchar();
getchar();
return 0;
}
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
#define N 20
int n;
int g[N][N];//路径矩阵
typedef struct{
int frequency;//去超市的频率
int num;//标号
char name[20];//地点名称
char imfomation[100];//简介
}place;
void floyd()
{
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
{
int t = g[i][k] + g[k][j];
if(t < g[i][j])
g[i][j] = t;
}
}
place places[20];
int min(int k,int g)
{
return k<g? k:g;
}
void get_place()
{
printf("请输入查询的地点标号");
int num;
scanf("%d",&num);
printf("地点%d的名字叫作%s,该地点去超市的频率为%d\n",num,places[num].name,places[num].frequency);
printf("简介:%s\n",places[num].imfomation);
}
void get_long()
{
int start,end;
printf("请输入出发的地点标号");
scanf("%d",&start);
printf("请输入结束的地点标号");
scanf("%d",&end);
printf("%s到%s的最短路径为%d米\n",places[start].name,places[end].name,g[start][end]);
}
void get_shop_place()
{
int Min=0x3f3f3f3f,Min_place=1;
for(int k = 1; k <= n; k ++)
{
int cnt=0;
for(int i = 1; i <= n; i ++)
{
if(k!=i)
{
cnt+=(g[i][k]*places[i].frequency);
}
}
printf("地点%d的名字叫作%s,该地点作为超市的距离的远近与频率为加权值为%d\n",k,places[k].name,cnt);
if(cnt<Min)
Min_place=k;
Min=min(Min,cnt);
}
printf("所以,最合适的超市位置为地点%d%s\n",Min_place,places[Min_place].name);
}
void create_places()
{
printf("请输入地点个数:\n");
scanf("%d",&n);
getchar();
for(int i=1;i<=n;i++)
{
printf("请输入第%d个地点的名称:\n",i);
char *name[20];
char *fomation[100];
scanf("%s",name);
strcpy(places[i].name,name);
// places[i].name=name;
printf("请输入第%d个地点的简介:\n",i);
scanf("%s",fomation);
//places[i].imfomation=fomation;
strcpy(places[i].imfomation,fomation);
printf("请输入第%d个地点人们去超市的的频率:\n",i);
scanf("%d",&places[i].frequency);
places[i].num=i;
}
}
void vista_palces()
{
for(int i=1;i<=n;i++)
{
printf("%d号地点为%s\n该地点去超市的频率为%d %,\n 简介: %s\n",i,places[i].name,places[i].frequency,places[i].imfomation);
}
}
void add()
{
int m;
printf("请输入路径个数:");
scanf("%d",&m);
while (m--) {
int a, b, c;
//a,b之间的距离为c
printf("请输入出发的地点标号");
scanf("%d", &a);
printf("请输入结束的地点标号");
scanf("%d", &b);
printf("请输入两点之间的距离");
scanf("%d", &c);
g[a][b] = c;
g[b][a] = c;
}
}
void choose()
{
int k;
printf("查询地点名称请输入1\n查询两地之间最短距离请输入2\n为超市选址,实现总体最优请输入3。\n");
scanf("%d",&k);
if(k==1)//
{
get_place();
}
else if(k==2)
get_long();
else if(k==3)
get_shop_place();
else
printf("输入有误!!!");
}
int main()
{
create_places();
//创建地点
vista_palces();
//遍历地点
add();
//增加路径
floyd();
//floyd就最短路
choose();
//选择操作
system("pause");
return 0;
}