zoukankan      html  css  js  c++  java
  • 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);
    }
    
  • 相关阅读:
    memcached 高级机制(一)
    memcached 简介
    Hibernate
    Linux中的搜索命令
    Linux的常用命令
    Git清除用户名和密码
    关于Git的简单使用
    文件的上传与下载(2)
    关于文件的上传和后台接收
    验证码的制作
  • 原文地址:https://www.cnblogs.com/amonqsq/p/13538210.html
Copyright © 2011-2022 走看看