【最短路】【Floyed】医院设置(ssl 1614)

医院设置

ssl 1614

题目大意:

有n个点,在一个点上安医院,使这个点到其他点的最短路之和最小

原题:

Description

设有一棵二叉树(如右图)。其中,圈中的数字表示结点中居民的人口。圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻接点之间的距离为1。如 右图中,若医院建在:
  1处,则距离和=4+12+220+240=136
  3处,则距离和=4*2+13+20+40=81
    ………….
【最短路】【Floyed】医院设置(ssl 1614)_第1张图片

Input

第一行一个整数n,表示树的结点数。(n<=100)
接下来的n行每行描述了一个结点的状况,包含三个整数,整数之间用空格(一个或多个)分隔,其中:第一个数为居民人口数;第二个数为左链接,为0表示无链接;第三个数为右链接。

Output

一个整数,表示最小距离和。

Sample Input

 5 
13 2 3 
4 0 0 
12 4 5 
20 0 0 
40 0 0 

Sample Output

81

解题思路

先连接的两个点用邻接矩阵存起来(双向),边权为1,然后直接用Floyed,最后每个点到其他点的最短路加在一起,取最小即可

代码:

#include
#include
#include
using namespace std;
int n,x,y,ans,sum,a[105],f[105][105];
int main()
{
	scanf("%d",&n);
	memset(f,127/3,sizeof(f));
	for (int i=1;i<=n;++i)
	  {
	  	scanf("%d %d %d",&a[i],&x,&y);
	  	f[i][x]=1;//存起来
	  	f[x][i]=1;//双向
	  	f[i][y]=1;
	  	f[y][i]=1;
	  	f[i][i]=0;//自身设为0
	  }
	for (int k=1;k<=n;++k)
	  for (int i=1;i<=n;++i)
	    for (int j=1;j<=n;++j)
	      f[i][j]=min(f[i][j],f[i][k]+f[k][j]);//Floyed
	ans=2147483647;
	for (int i=1;i<=n;++i)
	  {
	  	sum=0;
	  	for (int j=1;j<=n;++j)
	  	  sum+=a[j]*f[i][j];//相加
	  	ans=min(ans,sum);//取最小
	  }
	printf("%d",ans);
}

你可能感兴趣的:(最短路,图论)