试题编号: | 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 骗了80分。。。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
#include <math.H>
#include <limits.h>
using namespace std;
const int maxn=1009;
const int inf=0x3f3f3f3f;
typedef pair<int,int> p;
struct Node{
int x;
int y;
}P[210];
struct edge{
int to;
int cost;
};
int n,t,d[maxn];
vector<edge> g[maxn];
void dijkstra(int s){
priority_queue<p,vector<p>,greater<p> >qu;//堆按照p的first(最短距离)排序,小在前
fill(d,d+maxn,inf);
d[s]=0;
qu.push(p(0,s));//从起点出发到顶点s的最短距离为0
while(!qu.empty()){
p temp=qu.top();
qu.pop();
if(temp.first>d[temp.second]) continue;//跳过更新过程中入队的非最小值
for(int i=0;i<g[temp.second].size();++i){//遍历该顶点连出的每条边
edge e=g[temp.second][i];
if(d[e.to]>d[temp.second]+e.cost){
d[e.to]=d[temp.second]+e.cost;
qu.push(p(d[e.to],e.to));
}
}
}
}
int main(){
int n,m,k,r;
ios_base::sync_with_stdio(false);
while(cin>>n>>m>>k>>r){
for(int i=1;i<=n+m;++i){
cin>>P[i].x>>P[i].y;
}
edge e;
for(int i=1;i<=n+m;++i){
for(int j=i+1;j<=n+m;++j){
if((P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y)<=r*r){
e.to=i;
e.cost=1;
g[j].push_back(e);
e.to=j;
g[i].push_back(e);
}
}
}
dijkstra(1);
printf("%d\n",d[2]-1);
}
return 0;
}