1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| #include<bits/stdc++.h> #define dwb double
using namespace std;
const int MAXN = 55; const dwb eps = 1e-7;
dwb n, m, t1, t2, v; dwb tx[MAXN], ty[MAXN]; dwb mx[MAXN], my[MAXN];
int nodeCnt; vector<int> edge[MAXN * MAXN];
int match[MAXN]; bool vis[MAXN];
inline dwb calDist(dwb x1_, dwb y1_, dwb x2_, dwb y2_) { return sqrt((x1_ - x2_) * (x1_ - x2_) + (y1_ - y2_) * (y1_ - y2_)); }
inline void reset() { nodeCnt = 0; for (int i = 1; i <= n * m; ++i) edge[i].clear(); memset(match, 0, sizeof(match)); return; } inline void build(dwb TLE) { for (int i = 1; i <= n; ++i) for (int k = 0; k < m; ++k) { dwb fireTime = t1 + (dwb)k * (t1 + t2); if (fireTime > TLE) break; nodeCnt++; for (int j = 1; j <= m; ++j) { dwb flyTime = calDist(tx[i], ty[i], mx[j], my[j]) / v; if (fireTime + flyTime <= TLE) edge[nodeCnt].push_back(j); } } return; } inline bool dfs(int from) { for (int to : edge[from]) { if (vis[to]) continue; vis[to] = true; if (!match[to] || dfs(match[to])) { match[to] = from; return true; } } return false; } inline bool check(dwb TLE) { reset(); build(TLE); int res = 0; for (int from = 1; from <= nodeCnt; ++from) { memset(vis, 0, sizeof(vis)); if (dfs(from)) res++; } return res == m; }
int main() { scanf("%lf%lf%lf%lf%lf", &n, &m, &t1, &t2, &v); t1 /= 60.0; for (int i = 1; i <= m; ++i) scanf("%lf%lf", &mx[i], &my[i]); for (int i = 1; i <= n; ++i) scanf("%lf%lf", &tx[i], &ty[i]); dwb l = 0, r = 1e6; while (r - l > eps) { dwb mid = l + (r - l) / 2; check(mid) ? r = mid : l = mid; } printf("%.6lf\n", l); return 0; }
|