NO COPYING!
NO COPYING!
NO COPYING!
学校要建立一个娱乐中心,设计该娱乐中心的位置,使得各部门到中心的距离较近。
基本要求:
(1)顶点表示各部门,顶点之间连线上的权值表示两个部门的距离;
(2)采用邻接表存储图;
(3)采用Floyd算法求最短路径;
(4)输出各路径及其距离。
测试数据要求:
输入表示权值的整数必须是正整数。
//Sinhaeng Hhjian
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define MAX 100
using namespace std;
const int maxn=105;
struct vnode{
int ad, w;
vnode *next;
};
struct anode{
char data[MAX];
vnode *f;
};
struct graph{
int n, m, dis[maxn][maxn];
anode ver[maxn];
};
int lx(graph G, char x[]){
for(int i=0;i<G.n;i++)
if(strcmp(G.ver[i].data, x)==0)
return i;
return -1;
}
void bg(graph &G){
printf("请输入地点数量和连线数量:");
scanf("%d %d", &G.n, &G.m);
printf("请输入每个地点的信息(每个地点占用一行,如果是空地,则在前面加 #):\n");
for(int i=0;i<G.n;i++){
scanf("%s", G.ver[i].data);
G.ver[i].f=NULL;
}
printf("请输入地点之间的连线和距离:\n");
for(int i=0;i<G.m;i++){
char x[MAX], y[MAX];
int w;
scanf("%s %s %d", x, y, &w);
int u=lx(G, x);
int v=lx(G, y);
if(u==-1 || v==-1){
printf("ERROR!\n");
return ;
}
vnode *s=(vnode *)malloc(sizeof(vnode));
s->next=NULL;
s->ad=v;
s->w=w;
if(G.ver[u].f==NULL)
G.ver[u].f=s;
else{
vnode *p=G.ver[u].f;
while(p->next) p=p->next;
p->next=s;
}
vnode *ss=(vnode *)malloc(sizeof(vnode));
ss->next=NULL;
ss->ad=u;
ss->w=w;
if(G.ver[v].f==NULL)
G.ver[v].f=ss;
else{
vnode *p=G.ver[v].f;
while(p->next) p=p->next;
p->next=ss;
}
}
}
int dis(graph G, int x, int y){
if(x==y) return 0;
vnode *s=G.ver[x].f;
while(s && s->ad!=y)
s=s->next;
if(s)
return s->w;
return inf;
}
void Floyd(graph &G){
memset(G.dis, inf, sizeof(G.dis));
for(int i=0;i<G.n;i++){
G.dis[i][i]=0;
for(int j=0;j<G.n;j++)
for(int k=0;k<G.n;k++){
G.dis[i][k]=min(dis(G, i, k), G.dis[i][k]);
G.dis[k][j]=min(dis(G, k, j), G.dis[k][j]);
G.dis[i][j]=min(G.dis[i][k]+G.dis[k][j], G.dis[i][j]);
}
}
}
int findit(graph G){
int pos=0, minn=inf;
printf("\n");
for(int i=0;i<G.n;i++)
if(G.ver[i].data[0]=='#'){
int sum=0;
for(int j=0;j<G.n;j++){
if(G.ver[j].data[0]=='#')
continue;
sum+=G.dis[i][j];
}
if(sum<minn){
minn=sum;
pos=i;
}
printf("%s到其他各部门(除空地外)的总距离为:%d\n", G.ver[i].data, sum);
}
return pos;
}
int main(){
graph G;
bg(G);
Floyd(G);
int pos=findit(G);
printf("\n娱乐中心是:%s\n", G.ver[pos].data);
for(int i=0;i<G.n;i++){
if(i==pos)
continue;
printf("%s到%s的距离为:%d\n", G.ver[pos].data, G.ver[i].data, G.dis[pos][i]);
}
return 0;
}
/*
5 5
#空地a
商店
宿舍
教室
#空地b
#空地a 商店 11
#空地a 宿舍 4
商店 宿舍 6
商店 #空地b 7
教室 商店 2
*/