邮局选址问题(二)

问题描述:

某市有n个小区(坐标给出),每个小区的住户数不相同(带权)。现有一邮局将建在某小区内,要求到各个用户的距离之和最短,用分治法解答。

算法实现:

 

//========================================= //postOffice.cpp //n小区选邮局地址,带权,递归分治法,O(n*n) //by leo //3.18.2011 //========================================= #include #include #include #include using namespace std; //------------------------------------------ const int MAX_SIZE = 10000; typedef struct { int id; //小区编号 int distance; //到其它小区的距离和 } rdtQuarter; //居民小区 int numRdtQuarter; //小区数目 int x[MAX_SIZE]; //小区x坐标 int y[MAX_SIZE]; //小区y坐标 int numResident[MAX_SIZE]; //小区内居民数 //------------------------------------------ //求从idStart到idEnd编号的小区中, 哪一个到所有小区的加权距离和最短 //parameter:小区的起止编号 //return:到其他小区距离最短的小区(编号,距离) //------------------------------------------ rdtQuarter getBestQuarter(int idStart, int idEnd) { if (idStart == idEnd) //只有一个小区,返回该小区 { rdtQuarter rdtQuarter = {idStart, 0}; for (int i = 0; i < numRdtQuarter; i++) rdtQuarter.distance += numResident[i] * sqrt((x[idStart]-x[i])*(x[idStart]-x[i]) + (y[idStart]-y[i])*(y[idStart]-y[i])); return rdtQuarter; } else //否则, 分别查找左半和右半区间中的最佳小区 { rdtQuarter left = getBestQuarter(idStart, (idStart+idEnd)/2), right = getBestQuarter((idStart+idEnd+1)/2, idEnd); return left.distance < right.distance ? left : right; } } //------------------------------------------ int main() { cout << "请输入小区数量:"; cin >> numRdtQuarter; cout << "请分别输入" << numRdtQuarter << "个小区的x坐标、y坐标、居民数:/n"; for (int i = 0; i < numRdtQuarter; i++) { cout << "第" << i+1 << "个小区:"; cin >> x[i] >> y[i] >> numResident[i]; } rdtQuarter rdtQuarter = getBestQuarter(0, numRdtQuarter-1); cout << "到各个用户的距离之和最短的小区编号为: " << rdtQuarter.id+1 <<"/n该小区到各个用户的距离之和为: " <

算法分析:

复杂度为o(n2

你可能感兴趣的:(算法学习)