标签:
DLX+二分。
1 /* 2295 */ 2 #include <iostream> 3 #include <string> 4 #include <map> 5 #include <queue> 6 #include <set> 7 #include <stack> 8 #include <vector> 9 #include <deque> 10 #include <algorithm> 11 #include <cstdio> 12 #include <cmath> 13 #include <ctime> 14 #include <cstring> 15 #include <climits> 16 #include <cctype> 17 #include <cassert> 18 #include <functional> 19 #include <iterator> 20 #include <iomanip> 21 using namespace std; 22 //#pragma comment(linker,"/STACK:102400000,1024000") 23 24 #define sti set<int> 25 #define stpii set<pair<int, int> > 26 #define mpii map<int,int> 27 #define vi vector<int> 28 #define pii pair<int,int> 29 #define vpii vector<pair<int,int> > 30 #define rep(i, a, n) for (int i=a;i<n;++i) 31 #define per(i, a, n) for (int i=n-1;i>=a;--i) 32 #define clr clear 33 #define pb push_back 34 #define mp make_pair 35 #define fir first 36 #define sec second 37 #define all(x) (x).begin(),(x).end() 38 #define SZ(x) ((int)(x).size()) 39 #define lson l, mid, rt<<1 40 #define rson mid+1, r, rt<<1|1 41 42 const double eps = 1e-8; 43 const int maxn = 60; 44 int N, M, K; 45 double cx[maxn], cy[maxn]; 46 double rx[maxn], ry[maxn]; 47 bool visit[maxn]; 48 49 typedef struct { 50 static const int maxc = 65; 51 static const int maxr = 65; 52 static const int maxn = maxr * maxc; 53 54 int n, sz; 55 int S[maxc]; 56 57 int row[maxn], col[maxn]; 58 int L[maxn], R[maxn], U[maxn], D[maxn]; 59 60 int ansd; 61 62 void init(int n_) { 63 n = n_; 64 65 rep(i, 0, n+1) { 66 L[i] = i - 1; 67 R[i] = i + 1; 68 U[i] = i; 69 D[i] = i; 70 col[i] = i; 71 } 72 73 L[0] = n; 74 R[n] = 0; 75 76 ansd = INT_MAX; 77 sz = n+1; 78 memset(S, 0, sizeof(S)); 79 } 80 81 void addRow(int r, vi columns) { 82 int first = sz; 83 int size = SZ(columns); 84 85 rep(i, 0, size) { 86 int c = columns[i]; 87 88 L[sz] = sz - 1; 89 R[sz] = sz + 1; 90 91 D[sz] = c; 92 U[sz] = U[c]; 93 D[U[c]] = sz; 94 U[c] = sz; 95 96 row[sz] = r; 97 col[sz] = c; 98 99 ++S[c]; 100 ++sz; 101 } 102 103 L[first] = sz - 1; 104 R[sz - 1] = first; 105 } 106 107 void remove(int c) { 108 for (int i=D[c]; i!=c; i=D[i]) { 109 L[R[i]] = L[i]; 110 R[L[i]] = R[i]; 111 --S[col[i]]; 112 } 113 } 114 115 void restore(int c) { 116 for (int i=D[c]; i!=c; i=D[i]) { 117 L[R[i]] = i; 118 R[L[i]] = i; 119 ++S[col[i]]; 120 } 121 } 122 123 int H() { 124 int ret = 0; 125 126 memset(visit, false, sizeof(visit)); 127 for (int i=R[0]; i!=0; i=R[i]) { 128 if (visit[col[i]]) 129 continue; 130 ++ret; 131 visit[col[i]] = true; 132 for (int j=D[i]; j!=i; j=D[j]) { 133 for (int k=R[j]; k!=j; k=R[k]) { 134 visit[col[k]] = true; 135 } 136 } 137 } 138 139 return ret; 140 } 141 142 void dfs(int d) { 143 int delta = H(); 144 145 if (delta+d>=ansd || d+delta>K) 146 return ; 147 148 if (R[0] == 0) { 149 ansd = min(ansd, d); 150 return ; 151 } 152 153 int c = R[0]; 154 for (int i=R[0]; i!=0; i=R[i]) { 155 if (S[i] < S[c]) 156 c = i; 157 } 158 159 for (int i=D[c]; i!=c; i=D[i]) { 160 remove(i); 161 for (int j=R[i]; j!=i; j=R[j]) { 162 remove(j); 163 } 164 dfs(d + 1); 165 if (ansd <= K) 166 return ; 167 for (int j=L[i]; j!=i; j=L[j]) { 168 restore(j); 169 } 170 restore(i); 171 } 172 } 173 174 } DLX; 175 176 DLX solver; 177 178 double Length(int j, int i) { 179 return sqrt((cx[i]-rx[j])*(cx[i]-rx[j]) + (cy[i]-ry[j])*(cy[i]-ry[j])); 180 } 181 182 bool judge(double bound) { 183 memset(visit, false, sizeof(visit)); 184 solver.init(N); 185 186 rep(i, 1, M+1) { 187 vi columns; 188 int cnt = 0; 189 rep(j, 1, N+1) { 190 if (Length(i, j) <= bound) { 191 columns.pb(j); 192 visit[j] = true; 193 ++cnt; 194 } 195 } 196 197 if (SZ(columns) > 0) { 198 solver.addRow(i, columns); 199 } 200 } 201 202 rep(j, 1, N+1) { 203 if (!visit[j]) { 204 #ifndef ONLINE_JUDGE 205 // printf("ansd = %d\n", solver.ansd); 206 #endif 207 return false; 208 } 209 } 210 211 solver.dfs(0); 212 213 #ifndef ONLINE_JUDGE 214 // printf("ansd = %d\n", solver.ansd); 215 #endif 216 return solver.ansd<=K; 217 } 218 219 int main() { 220 ios::sync_with_stdio(false); 221 #ifndef ONLINE_JUDGE 222 freopen("data.in", "r", stdin); 223 freopen("data.out", "w", stdout); 224 #endif 225 226 double ans; 227 double l, r, mid; 228 int t; 229 230 scanf("%d", &t); 231 while (t--) { 232 scanf("%d %d %d", &N, &M, &K); 233 rep(i, 1, N+1) 234 scanf("%lf %lf", &cx[i], &cy[i]); 235 rep(i, 1, M+1) 236 scanf("%lf %lf", &rx[i], &ry[i]); 237 l = 0; 238 r = ans = 2000.0; 239 while (r >= l) { 240 mid = (r + l) / 2.0; 241 if (judge(mid)) { 242 ans = min(ans, mid); 243 r = mid - eps; 244 } else { 245 l = mid + eps; 246 } 247 } 248 printf("%.06lf\n", ans); 249 } 250 251 #ifndef ONLINE_JUDGE 252 printf("time = %d.\n", (int)clock()); 253 #endif 254 255 return 0; 256 }
标签:
原文地址:http://www.cnblogs.com/bombe1013/p/4976400.html