广搜...
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct Stat {
ll cur;
ll step;
ll k_cnt;
};
struct point {
ll x;
ll y;
};
ll n, m, r, k;
vector<point> nx;
queue<Stat> q;
vector<int> g[550];
ll dist(point a, point b) {
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
ll bfs() {
vector<bool> vis(n + m + 10, false);
vis[0] = true;
q.push({0,0,0});
while (!q.empty()) {
auto cur = q.front();
q.pop();
if (cur.cur == 1) {
return cur.step - 1;
}
for (auto t : g[cur.cur]) {
if (!vis[t] ) {
if (t >= n && cur.k_cnt < k) {
q.push({t, cur.step + 1, cur.k_cnt + 1});
vis[t] = true;
} else if (t < n && cur.k_cnt <= k) {
q.push({t, cur.step + 1, cur.k_cnt});
vis[t] = true;
}
}
}
}
}
int main() {
cin >> n >> m >> k >> r;
for (int i = 0; i < n; i++) {
ll x, y;
cin >> x >> y;
nx.push_back({x, y});
}
for (int i = 0; i < m; i++) {
ll x, y;
cin >> x >> y;
nx.push_back({x, y});
}
for (int i = 0; i < n + m; i++) {
for (int j = i + 1; j < n + m; j++) {
if (dist(nx[i], nx[j]) <= r * r) {
g[i].push_back(j);
g[j].push_back(i);
}
}
}
cout << bfs();
}