医院设置

题目大意:

给一个无向图,然后,每个点有一定的居民数量,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为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;
}

猜你喜欢

转载自blog.csdn.net/qq_39798042/article/details/82463581