代码战绩:0ms,25行,易懂
算法:Floyd求最短路
因为n小的只有100,所以用Floyd O(n^3) 的算法也能轻松搞定。
1.读入,存图,用邻接矩阵存0,1,表示有没有边
2.Floyd求最短路
3.算出每个医院设在i点所需要的费用
4.输出
详见代码:
#include <bits/stdc++.h>
#define INF 99999999
#define N 101
#define fr(i,n,m) for (int i=n;i<=m;i++)
using namespace std;
int a[N][N],b[N];
int n,c[2] ;//c[1]表示左链接,c[2]表示右链接
int main()
{
scanf("%d",&n);
fr(i,1,n) fr(j,1,n) a[i][j]=INF; //初始化
fr(i,1,n){
scanf("%d%d%d",&b[i],&c[0],&c[1]);
fr(j,0,1) if (c[j]!=0) a[i][c[j]]=a[c[j]][i]=1; //将相连的点连接起来
}
fr(k,1,n) fr(i,1,n) fr(j,1,n)//Floyd求最短路
if (a[i][j]>a[i][k]+a[k][j] && k!=i && i!=j && j!=k ) a[i][j]=a[i][k]+a[k][j];
int ans=2147483647;
fr(i,1,n){//算出如果医院设在i点所需的费用
int sum=0;
fr(j,1,n) if (i!=j) sum+=a[j][i]*b[j];
ans=min(ans,sum) ;
}
printf("%d\n",ans);
}