问题: n个社区之间的交通图用无向加权图表示,现在要从这n个社区中选择一个社区建一所医院,问这所医院应建在哪个社区,能使所有的社区离医院都比较近(能使离医院最远的社区到医院最近) 或能使所有的社区到达医院的距离之和达到最小?
分析:问题中明确提出要考虑所有社区到医院的距离,而我们要对医院进行选址,必然要假定各个社区都做一遍医院,这就需要我们求出任意两个社区之间的最小距离,求一个无向加权图中任意两个点之间的最小距离,FLoyd算法是当仁不让的选择,Floyd算法可以求出一个矩阵,从矩阵中我们可以得到任意两个点之间的距离
至于对Floyd还不太了解的朋友,我在此转一篇帖子点击打开链接,有兴趣的可以看一下。
const int INF=1e9;
class hospital
{
public:
hospital(int n=1)//构造函数
{
num=n;
edge=new int*[n+1];
for(int i=1;i<=n;i++)
{
edge[i]=new int[n+1];
memset(edge[i],0,sizeof(int)*(n+1));
}
}
void getSite();//对数据进行筛选,得到最后的选址
private:
int **edge;//记录两点之间的距离
int num;//社区的个数
void getEdge();//得到不经过其他社区的直达距离
void updateEdge();//对edge数组进行更新,最后将距离达到最小
};
构造函数的定义已在类的声明中给出,但要注意的是如何给二维数组动态分配内存空间,以及如何对edge进行清零操作,memset(edge,0,sizeof(edge))肯定是不行的,具体原因与我