题目大意:
给一个无向图,然后,每个点有一定的居民数量,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为1。
解题思路:
是的你没看错 还是一道最短路
n<=100 于是就可以用Floyd
Accepted code:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define inf 100000007
int p[105],dis[105][105],sum,n,l,r;
using namespace std;
int main() {
scanf("%d",&n);
memset(dis,127/3,sizeof(dis));
for(int i=1;i<=n;i++) {
dis[i][i]=0;
scanf("%d",&p[i]);
scanf("%d%d",&l,&r);
dis[i][l]=dis[l][i]=dis[i][r]=dis[r][i]=1;
}
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&j!=k&&i!=k)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
int minn=inf;
for(int i=1;i<=n;i++) {
sum=0;
for(int j=1;j<=n;j++) {
if(i!=j&&dis[i][j]!=-1) sum+=p[j]*dis[i][j];
}
minn=min(minn,sum);
}
return printf("%d",minn)&0;
}