• CCF模拟 无线网络


    无线网络

    时间限制: 1.0s
    内存限制: 256.0MB
     
    问题描述
      目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上。任何两个无线路由器只要距离不超过 r 就能互相建立网络连接。
      除此以外,另有 m 个可以摆放无线路由器的位置。你可以在这些位置中选择至多 k 个增设新的路由器。
      你的目标是使得第 1 个路由器和第 2 个路由器之间的网络连接经过尽量少的中转路由器。请问在最优方案下中转路由器的最少个数是多少?
     
    输入格式
      第一行包含四个正整数 n,m,k,r。(2 ≤ n ≤ 100,1 ≤ k ≤ m ≤ 100, 1 ≤ r ≤ 108)。
      接下来 n 行,每行包含两个整数 xi 和 yi,表示一个已经放置好的无线 路由器在 (xi, yi) 点处。输入数据保证第 1 和第 2 个路由器在仅有这 n 个路由器的情况下已经可以互相连接(经过一系列的中转路由器)。
      接下来 m 行,每行包含两个整数 xi 和 yi,表示 (xi, yi) 点处可以增设 一个路由器。
      输入中所有的坐标的绝对值不超过 108,保证输入中的坐标各不相同。
     
    输出格式
      输出只有一个数,即在指定的位置中增设 k 个路由器后,从第 1 个路 由器到第 2 个路由器最少经过的中转路由器的个数。
     
    样例输入
    5 3 1 3
    0 0
    5 5
    0 3
    0 5
    3 5
    3 3
    4 4
    3 0
     
    样例输出
    2
     
    解题:搜索,注意数据范围,小心溢出
     1 #include <bits/stdc++.h>
     2 #define LL long long
     3 using namespace std;
     4 const int maxn = 300;
     5 struct point {
     6     int x,y,isadded;
     7 } p[maxn*maxn];
     8 int n,m,k,d[maxn];
     9 double r;
    10 double getDis(int i,int j) {
    11     double tmp = (LL)(p[i].x - p[j].x)*(p[i].x - p[j].x);
    12     tmp += (LL)(p[i].y - p[j].y)*(p[i].y - p[j].y);
    13     return sqrt(tmp);
    14 }
    15 struct node {
    16     int id,pass,added;
    17     node(int x = 0,int y = 0,int z = 0) {
    18         id = x;
    19         pass = y;
    20         added = z;
    21     }
    22 };
    23 queue<node>q;
    24 int bfs(){
    25     memset(d,0x3f,sizeof(d));
    26     while(!q.empty()) q.pop();
    27     d[0] = 0;
    28     q.push(node(0,0,0));
    29     while(!q.empty()){
    30         node now = q.front();
    31         q.pop();
    32         for(int i = 1; i < n+m; ++i)
    33         if(i != now.id && getDis(i,now.id) <= r&& now.added+p[i].isadded <= k && d[i] > now.pass+1){
    34             d[i] = now.pass + 1;
    35             //cout<<i<<" "<<d[i]<<endl;
    36             q.push(node(i,d[i],now.added+p[i].isadded));
    37         }
    38     }
    39     return d[1] - 1;
    40 }
    41 int main() {
    42     while(~scanf("%d %d %d %lf",&n,&m,&k,&r)) {
    43         for(int i = 0; i < n + m; ++i) {
    44             scanf("%d %d",&p[i].x,&p[i].y);
    45             p[i].isadded = i >= n?1:0;
    46         }
    47         cout<<bfs()<<endl;
    48     }
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    Android JNI与多线程
    V8 API Reference Guide
    V8引擎嵌入指南
    google v8引擎常见问题
    Android单例模式
    setTimeout和setInterval
    Android ANR
    android全屏
    Android进程和线程(Android开发指南--译)
    ubuntu下一次网络流量危机
  • 原文地址:https://www.cnblogs.com/crackpotisback/p/4361849.html
Copyright © 2020-2023  润新知