问题描述
试题编号: | 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 <bits/stdc++.h>
using namespace std;
const int M=205;
struct Node
{
long long x,y;//坐标
long long step;//步长
long long k; //新增加的个数
Node()
{
step=k=0;
}
Node(int x,int y,int step,int k):x(x),y(y),step(step),k(k)
{
}
};
Node ma[M];
int vis[M]={0};
int _maxn=-1;
long long n,m,k,r;
int bfs(int begin,int end)
{
queue<Node> q;
q.push( Node(ma[begin].x,ma[begin].y,0,0) );//起始点入队
vis[begin]=1;
while(!q.empty())
{
Node tmp=q.front();
q.pop();
if(tmp.x==ma[end].x&&tmp.y==ma[end].y)//找到结尾
return tmp.step-1;
if(tmp.k==k)//不能再添加
{
_maxn=n;
}
else
_maxn=m+n;
for(int i=1;i<=_maxn;i++)
{
if(vis[i])
{
continue;
}
if((ma[i].x-tmp.x)*(ma[i].x-tmp.x)+(ma[i].y-tmp.y)*(ma[i].y-tmp.y)>r*r)
continue;
vis[i]=1;
q.push( Node(ma[i].x,ma[i].y,tmp.step+1,i>n?tmp.k+1:tmp.k) );
}
}
}
int main()
{
cin>>n>>m>>k>>r;
for(int i=1;i<=n+m;i++)
{
cin>>ma[i].x>>ma[i].y;
}
int ans=bfs(1,2);
cout<<ans;
}