(ccf)无线网络 /BFS/spfa

版权声明:欢迎转载!拒绝抄袭. https://blog.csdn.net/qq_36257146/article/details/82862014
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

这道题其实和之前没有什么不一样的,只是距离有要求,可以换成邻接矩阵,然后因为新增加的不能超过k个,虽然遍历时是视为和原来就有的路由器一样的,但是做个标记,如果把它加入队列,就要计数,如果超过k个就不要这个了.

稍微动下脑筋.

下面是spfa

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <queue>
#define maxn 250
#define ll long long
#define inf 0x3f3f3f
using namespace std;
int n,m,k;
ll r;
int visited[maxn];
vector<int>far[maxn];
int dis[maxn];
int Max;

struct Node
{
	ll x,y;
	int step,kCount;
	Node(ll x1,ll y1,int s,int kCount1)
	{
		x = x1;
		y = y1;
		step = s;
		kCount = kCount1;
	}
};
vector<Node>nodes;
vector<Node>nodeK;

void BFS(int begin)
{
	memset(visited,0,sizeof(visited));
	memset(dis,0,sizeof(dis));
	queue<int>q;
	q.push(begin);
	visited[begin] = 1;
	Max = n+m;
	while(!q.empty())
	{
		int v = q.front();
		Node start = nodes[v];
		ll startX = start.x;
		ll startY = start.y;
		q.pop();
		if(nodes[v].kCount== k)
		{
			Max = n;
		}
		for(int i = 0; i<Max; i++)
		{
			Node final = nodes[i];
			if(!visited[i]&&((startX-final.x)*(startX-final.x)+(startY-final.y)*(startY-final.y))<=r*r)
			{
				visited[i] = 1;
				if(i>=n)
					nodes[i].kCount = nodes[v].kCount+1;
				else
					nodes[i].kCount = nodes[v].kCount;
				dis[i] = dis[v]+1;
				q.push(i);
			}
		}
	}

}

void spfa(int begin)
{
	memset(visited,0,sizeof(visited));
	memset(dis,inf,sizeof(dis));
	queue<int>q;
	q.push(begin);
	visited[begin] = 1;
	dis[begin] = 0;
	while(!q.empty())
	{
		int v = q.front();
		q.pop();
		visited[v] = 0;
		for(int i = 0; i<far[v].size(); i++)
		{
			int u = far[v][i];
			if(u>=n)
			{
				nodes[u].kCount = nodes[v].kCount+1;
			}
			if(nodes[u].kCount>k) continue;
			if(dis[v]+1<dis[u])
			{
				dis[u] = dis[v]+1;
				if(!visited[u])
				{
					visited[u] = 1;
					q.push(u);
				}
			}
				
		}
	}

}

int main(int argc, char** argv)
{
	cin>>n>>m>>k>>r;
	ll x,y;
	for(int i = 0; i<n+m; i++)
	{
		cin>>x>>y;
		nodes.push_back(Node(x,y,0,0));
	}
	//建立邻接矩阵
	for(int i = 0; i<n+m; i++)
	{
		for(int j = i+1; j<n+m; j++)
		{
			if(((nodes[i].x-nodes[j].x)*(nodes[i].x-nodes[j].x)+(nodes[i].y-nodes[j].y)*(nodes[i].y-nodes[j].y))<=r*r)
			{
				far[i].push_back(j);
				far[j].push_back(i);
			}
		}
	}
	spfa(0);
	cout<<dis[1]-1<<endl;
	return 0;
}

/**
5 3 1 3
 0 0
 5 5
 0 3
 0 5
 3 5
 3 3
 4 4
 3 0
 **/

然后是BFS

#include <iostream>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <queue>
#define maxn 250
#define ll long long
using namespace std;
int n,m,k;
ll r;
int visited[maxn];
int dis[maxn];
int Max;

struct Node{
	ll x,y;
	int step,kCount;
	Node(ll x1,ll y1,int s,int kCount1)
	{
		x = x1;
		y = y1;
		step = s;
		kCount = kCount1;
	}	
};
vector<Node>nodes;
vector<Node>nodeK;

void BFS(int begin,int end)
{
	memset(visited,0,sizeof(visited));
	memset(dis,0,sizeof(dis));
	queue<int>q;
	q.push(begin);
	visited[begin] = 1;
	Max = n+m;
	//dis[begin] = 0;
	while(!q.empty())
	{
		int v = q.front();
		Node start = nodes[v];
		ll startX = start.x;
		ll startY = start.y;
		q.pop();
		if(nodes[v].kCount== k)
		{
			Max = n;
		}
		for(int i = 0;i<Max;i++)
		{
			Node final = nodes[i];
			if(!visited[i]&&((startX-final.x)*(startX-final.x)+(startY-final.y)*(startY-final.y))<=r*r)
			{
				visited[i] = 1;
				if(i>=n)
					nodes[i].kCount = nodes[v].kCount+1;
				else
					nodes[i].kCount = nodes[v].kCount;
				dis[i] = dis[v]+1;
				q.push(i);
			}
		}
	}
	
}

int main(int argc, char** argv) {
	cin>>n>>m>>k>>r;
	ll x,y;
	for(int i = 0;i<n+m;i++)
	{
		cin>>x>>y;
		nodes.push_back(Node(x,y,0,0));
	}	
	BFS(0,1);
	cout<<dis[1]-1<<endl;
	return 0;
}

/**
5 3 1 3
 0 0
 5 5
 0 3
 0 5
 3 5
 3 3
 4 4
 3 0
 **/

猜你喜欢

转载自blog.csdn.net/qq_36257146/article/details/82862014