美文网首页
2020-07-10医院设置

2020-07-10医院设置

作者: JalorOo | 来源:发表于2020-07-10 22:20 被阅读0次

题目:https://www.luogu.com.cn/problem/P1364

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<set>
using namespace std;
int read(){
    int x=0,f=1;
    char c = getchar();
    while(c<'0'||c>'9'){//符号位
        if(c=='-')
            f=-1;
        c = getchar();
    }
    while(c>='0'&&c<='9'){//数字
        x = x*10 + c -'0';
        c=getchar();
    }
    return x*f;
}


int a[101],g[101][101];

int main()
{
    /*read*/
    int n = read();
    
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            g[i][j]=1000000;
        }
    }
    for(int i=1;i<=n;i++)//读入、初始化
    {
        int l,r;
        g[i][i]=0;
        a[i] = read();
        l = read();
        r = read();
        if(l>0){
            g[i][l] = g[l][i] = 1;
        }
        if(r>0){
            g[i][r] = g[r][i] = 1;
        }
    }
    
    /*func*/
    for(int k=1;k<=n;k++)//用Floyed求任意两结点之间的最短路径
    {
        for(int i=1;i<=n;i++)
        {
            if(i!=k)
            {
                for(int j=1;j<=n;j++)
                {
                    if(i!=j&&k!=j&&(g[i][k]+g[k][j]<g[i][j]))
                        g[i][j]=g[i][k]+g[k][j];
                }
            }
        }
    }
    
    int min=0x7fffffff;
    int total;
    for(int i=1;i<=n;i++)//穷举医院建在N个结点,找出最短距离
    {
        total=0;
        for(int j=1;j<=n;j++){
            total+=g[i][j]*a[j];
        }
        if(total<min){
            min=total;
        }
    }
    printf("%d",min);
    return 0;
}
/*
5
13 2 3
4 0 0
12 4 5
20 0 0
40 0 0
*/

相关文章

网友评论

      本文标题:2020-07-10医院设置

      本文链接:https://www.haomeiwen.com/subject/pwuvcktx.html