医院设置

题面

裸的最短路版子

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define big 100000007
int p[101],dis[101][101],sum;
int n,l,r;
using namespace std;
int main()
{
    cin>>n;
    memset(dis,big,sizeof(dis));
    for(int i=1;i<=n;i++)
    {
        dis[i][i]=0;
        cin>>p[i];
        cin>>l>>r;
        if(l>=0) dis[i][l]=1;dis[l][i]=1; 
        if(r>=0) dis[i][r]=1;dis[r][i]=1;
    }
    for(int k=1;k<=n;k++)
    {
        for(int i=1;i<=n;i++)
        {
            if(i!=k)
            {
                for(int j=1;j<=n;j++)
                {
                    if(i!=j&&k!=j&&dis[i][j]>dis[i][k]+dis[k][j]) dis[i][j]=dis[i][k]+dis[k][j];
                }
            }
        }
    }
    int minn=big;
    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];  
        }
        if(minn>sum) minn=sum;
    }
    cout<<minn<<endl;
    return 0;
}

  

posted @ 2019-07-15 13:47  [jackeylove]  阅读(102)  评论(0编辑  收藏  举报