试题编号: | 201403-4 |
试题名称: | 无线网络 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 目前在一个很大的平面房间里有 n 个无线路由器,每个无线路由器都固定在某个点上。任何两个无线路由器只要距离不超过 r 就能互相建立网络连接。 输入格式 第一行包含四个正整数 n,m,k,r。(2 ≤ n ≤ 100,1 ≤ k ≤ m ≤ 100, 1 ≤ r ≤ 108)。 输出格式 输出只有一个数,即在指定的位置中增设 k 个路由器后,从第 1 个路 由器到第 2 个路由器最少经过的中转路由器的个数。 样例输入 5 3 1 3 样例输出 2 |
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <time.h>
#include <vector>
#include <list>
using namespace std;
//201403-4 无线网络(100)
struct Tran {
char flag; //flag代表状态0:搜索完,1:搜索部分,2:未搜索
bool num; //是否需要新设
int lenth, sum; //中转数,新设中转数
Tran(char _flag, bool _num, int _lenth, int _sum)
:flag(_flag), num(_num), lenth(_lenth), sum(_sum) {}
Tran() {}
};
struct Pos {
long long x, y;
Pos(long long _x, long long _y) : x(_x), y(_y) {}
Pos() {}
//map中Key为结构体时应定义其排序方式,且保证不重叠
bool operator <(const Pos& s)const
{
if (x != s.x)
return x < s.x;
else
return y < s.y;
//return (x*x + y * y) < (s.x*s.x + s.y*s.y); //从小到大排序
}
};
bool Judge(Pos p, Pos s, long long R)
{
return ((p.x - s.x)*(p.x - s.x) + (p.y - s.y)*(p.y - s.y)) <= R * R;
}
int main()
{
int i, j, t;
int N, M, K, R;
//N个已有路由器,M个可设置路由器,可新设至多K个,半径R
cin >> N >> M >> K >> R;
Pos From, To, P;
map<Pos, Tran>Data;
cin >> From.x >> From.y;
Tran T(1, 0, 0, 0);
Data[From] = T;
cin >> To.x >> To.y;
T.flag = 2; //2 0 0 0
Data[To] = T;
for (i = 2; i < N; i++)
{
cin >> P.x >> P.y;
Data[P] = T;
}
T.num = 1; //2 1 0 0
for (i = 0; i < M; i++)
{
cin >> P.x >> P.y;
Data[P] = T;
}
queue<Pos>store; //先进先出队列
store.push(From);
//Data.erase(From);
while (!store.empty())
{
Pos front = store.front(); //根节点
for (map<Pos, Tran>::iterator it = Data.begin(); it != Data.end(); it++)
{
if (Judge((*it).first, front, R) && Data[(*it).first].flag == 2)
{
if ((Data[front].sum + Data[(*it).first].num) <= K)
{
//cout << front.x<< front.y<<" "<<(*it).first.x << (*it).first.y << endl;
Data[(*it).first].flag = 1;
Data[(*it).first].lenth = Data[front].lenth + 1;
//if ((*it).first.x == To.x && (*it).first.y == To.y)
// goto jump;
Data[(*it).first].sum = Data[front].sum + Data[(*it).first].num;
store.push((*it).first);
//Data.erase((*it).first); //在迭代时删除元素会导致出错
}
}
}
Data[front].flag = 0;
store.pop();
}
jump:
cout << Data[To].lenth - 1;
cin >> N;
return 0;
}