美文网首页
2020-03-13(CCF201403-4 无线网络)

2020-03-13(CCF201403-4 无线网络)

作者: V_6619 | 来源:发表于2020-03-13 14:27 被阅读0次
#include <iostream>
#include <queue>
//#include <cmath>
//#include <cstring>
 using namespace std;
 
 /*
    把坐标转换成顶点
    将顶点抽象出来以后,就可以运用正常的邻接矩阵来做, 
 */
 
const int N = 210;
int g[N][N];  // 1 代表有边 
bool flag[N]; // 是否在新增里,true 表示在新增的里面 
typedef pair<int, int> PII;
PII tmp[N]; //将路由器的坐标先存进来, 再构造图 
int res[N]; // 存放结果 ,表示第 i 个路由器的最小步数是多少 
int n, m, k;
long long r;
queue<PII> q;  // first: 第几个顶点(路由器)   second: 此时经过了多少个新增设的 (注意要 <= k) 
//int bet; // 表示经过了多少个新增的,必须 <= k 
bool st[N]; // 标记该点(路由器)有没有被找过 

long long dist(long long a, long long  b, long long c, long long  d)
{
    long long res = (long long )((c-a) * (c-a)) + (long long)((d - b) * (d - b));
    return res;
}

void make_graph()
{
    for(int i = 1; i <= n+m; i++)
    {
        for(int j = i+1; j <= n+m; j++)
        {
             long long t = dist(tmp[j].first, tmp[j].second, tmp[i].first, tmp[i].second); 
            if( t  <= (long long )(r * r) ) 
            {
                g[i][j] = g[j][i] = 1;
            }
            
        }
        if(i > n) flag[i] = true;
          
    }
}

 int main()
 {
    scanf("%d%d%d%d", &n, &m, &k, &r);

    
    for(int i = 1; i <= n+m; i++)
    {
        long long a, b;
        scanf("%lld %lld", &a, &b); 
        tmp[i].first = a;   tmp[i].second = b; 
    }
    
    make_graph();   
     q.push({1, 0});
     st[1] = true;
     while(q.size())
     {
        PII t = q.front();
        int x = t.first,   bet = t.second;
        st[x] = true;
        q.pop();
        if(x == 2) break;
        for(int i = 1; i <= n+m; i++)
        {
            if( !st[i] && g[x][i] && bet <= k) // 有边,但还要分是新增的还是可以随便放的 
             {
                if(!flag[i]) //可以随便放
                  {
                      res[i] = res[x] + 1;
                      if(!st[i])
                      {
                        q.push({i, bet});
                       } 
                      st[i] = true;
                      
                  } 
                  
                if(flag[i] && bet +1 <=k)
                {
                    res[i] = res[x] + 1;
                    if(!st[i]) 
                    {
                        q.push({i, bet + 1});
                    }
                    st[i] = true;
                    
                }
             }  
        }
     }

    cout<<res[2] - 1<<endl;
  }

相关文章

网友评论

      本文标题:2020-03-13(CCF201403-4 无线网络)

      本文链接:https://www.haomeiwen.com/subject/bgahshtx.html