版权声明:欢迎转载!拒绝抄袭. https://blog.csdn.net/qq_36257146/article/details/82862014
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 |
这道题其实和之前没有什么不一样的,只是距离有要求,可以换成邻接矩阵,然后因为新增加的不能超过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
**/