201403-4 无线网络

思路

测试数据很弱,用广搜就可以找到最短路。但是贪心算法应该不能每次都找到最优解。
如果可以在超过K个位置中选择添加路由器实现更短的路径,那么贪心的选择就是最先搜索到的k个位置。换句话说贪心认为无论在哪里添加路由器,减少中转的效果是一样的。列举一些简单情况可以证明这是不合理的。

实现

#include <iostream>
#include <cmath>
#include <queue>

#define MAX_ROUTERS 0xff
#define pow(x) ((x)*(x))

struct point {
	long long x;
	long long y;
};

struct node {
	int id;
	int level;
	int append_num;
	node (int id, int level,int append_num): id(id), level(level), append_num(append_num) {}
};

int routers_number, unused_point_number, append_number;
long long dist;
point routers[MAX_ROUTERS];
bool graph[MAX_ROUTERS][MAX_ROUTERS]; 
bool visit[MAX_ROUTERS];

int dfs(int start, int target) {

	int count = 0;
	node origin = node(start, 0, 0);
	std::queue<node> nodes;
	nodes.push(origin);
	
	while (!nodes.empty()) {
		
		node point_tmp = nodes.front();
		nodes.pop();
		int temp_level = point_tmp.level;
		int temp_append_num = point_tmp.append_num;
		
		if (point_tmp.id == target) {
			return point_tmp.level - 1;
		}
		
		int i;
		for (i = 0;i < routers_number;++i) {
			if (!visit[i] && graph[point_tmp.id][i]) {
				nodes.push(node(i, temp_level + 1,temp_append_num));
				visit[i] = true;
			}
		}
		
		for (;i < routers_number + unused_point_number;++i) {
			if (!visit[i] && graph[point_tmp.id][i] 
				&& temp_append_num < append_number) {
				nodes.push(node(i, temp_level + 1,temp_append_num + 1));
				visit[i] = true;
			}
		}
	}
}

int main() {
	
	std::cin >> routers_number 
			 >> unused_point_number 
			 >> append_number;
	
	std::cin >> dist;
	
	int i,j;
	for (i = 0;i < routers_number + unused_point_number;++i) {
		std::cin >> routers[i].x >> routers[i].y;
	}
	
	for (i = 0;i < routers_number + unused_point_number;++i) {
		for (j = i+1;j < routers_number + unused_point_number;++j) {
			graph[i][j] = graph[j][i] 
			= std::sqrt(pow(routers[i].x-routers[j].x)+
						pow(routers[i].y-routers[j].y)) <= dist;
		}
	}

	std::cout << dfs(0,1);
}
原文地址:https://www.cnblogs.com/amonqsq/p/13538210.html