问题描述
n个社区之间的交通图用有向加权图表示,先要从这n个社区中选择一个社区建立一所医院,问这所医院应建在那个社区,能使所有的社区都离这家医院比较近(能使离医院最远的社区到医院最近)或能使所有的社区达到医院的距离之和达到最小。
问题分析
关键就是要使所有的社区到达医院的距离之和最小。有两种办法,一种是直接运用弗罗伊得算法,求出任意两点之间的最短路径在求和。还有一种就是对每个点用dijkstra方法求出带其他点的最短路径之和然后在比较选最小的。在这里我用了第二种方法。
具体实现
void linkedDgraph1::shortPaths(int sourceVertex,int *distanceFromSource,int *predecessor)
{
graphChain<int> newReachableVertices;
for(int i=1;i<=num1;i++)
{
distanceFromSource[i]=getWeight(sourceVertex,i);
if(distanceFromSource[i]==10000)//10000代表着不存在此边
predecessor[i]=-1;
else
{
predecessor[i]=sourceVertex;
newReachableVertices.insert(i,0);//插入此节点
}
}
distanceFromSource[sourceVertex]=0;
predecessor[sourceVertex] =0;
while(!newReachableVertices.empty())
{ //找到链表中的距离最小的点
graphNode<int> *p=newReachableVertices.first()