201403-4 无线网络(BFS)

试题编号: 201403-4
试题名称: 无线网络
时间限制: 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

#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;
}

猜你喜欢

转载自blog.csdn.net/yanpr919/article/details/81195289
今日推荐