医院设置
裸的最短路版子
#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;
}

浙公网安备 33010602011771号