• 201403-4


    问题描述
      目前在一个很大的平面房间里有 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
    ————————————————————————————————————————————————————————————————————————————————————————
    BFS
    因为BFS 同时入队的处于同一level, 所以最开始满足条件的,肯定经过的最少的
    #include<iostream>
    #include<queue>
    #include<vector>
    using namespace std;
    
    struct node
    {
        long long x;
        long long y;
    }N;
    
    struct info
    {
        int id;
        int sum_k;
        int sum_step;
    }T;
    
    int n,m,k;
    long long r;
    vector<struct node>v;
    queue<struct info>q;
    
    int vis[205]={0};
    
    bool judge(long long x1,long long x2,long long y1,long long y2)
    {
        long long a,b;
        a = (x1-x2);
        b = (y1-y2);
        
        if ((a*a)+(b*b)<=(r*r))return true;
        else return false;
    }
    
    int bfs()
    {
    //    struct info new_T;
        T.id = 0;
        T.sum_k = 0;
        T.sum_step =0;
        
        q.push(T);
        vis[T.id] = 1;
    
        
        while (!q.empty())
        {
            struct info new_T = q.front();
    
            q.pop();
            int id = new_T.id;
            int sum_k = new_T.sum_k;
            
            if (judge(v[id].x ,v[1].x , v[id].y ,v[1].y))
            {
                return new_T.sum_step;
            }
            
            for (int i=0;i<v.size();i++)
            {
                
                if (sum_k>=k && i>=n)continue;
                
                if (!vis[i] && i!=id && judge(v[id].x,v[i].x,v[id].y,v[i].y))
                {
                    T.id = i;
                    T.sum_step  = new_T.sum_step +1;
                    if (i>=n)T.sum_k +=1;
                    else if (i<n)T.sum_k = sum_k;
                    q.push(T);
                    vis[i] = 1;
                }
            }
        }
        
    }
    
    
    
    int main()
    {
        cin >>n>>m>>k>>r;
        for(int i=0;i<n+m;i++)
        {
            long long x,y;
            cin>>x>>y;
            N.x = x;  N.y = y;
            v.push_back(N);
        }
    
        cout<<bfs();
        
        return 0;
     } 
  • 相关阅读:
    Array 对象-sort()
    vue安装
    前端面试题
    JavaScript对象原型
    CSS如何水平垂直居中?
    块格式化上下文(Block Formatting Context,BFC)
    盒子模型
    前端基础
    Markdown语法
    浏览器 滚动条 占据 y轴宽度的解决方案
  • 原文地址:https://www.cnblogs.com/wuxiaotianC/p/9504094.html
Copyright © 2020-2023  润新知