Pagini recente » Cod sursa (job #1677535) | Cod sursa (job #1108603) | Cod sursa (job #1219971) | Cod sursa (job #2394336) | Cod sursa (job #1223639)
#include <vector>
#include <algorithm>
#include <queue>
#include <fstream>
#include <cmath>
#include <cstring>
#define pe pair<double, double>
#define mp make_pair
#define fi first
#define se second
using namespace std;
ifstream fin("adapost.in");
ofstream fout("adapost.out");
const int MAX_N = 410;
vector<pe> ad, sl;
int n;
double MAX_E;
vector<int> A[2 * MAX_N];
vector<int> B[MAX_N];
int S, D;
int c[2 * MAX_N][2 * MAX_N];
int f[2 * MAX_N][2 * MAX_N];
double cost[2 * MAX_N][2 * MAX_N];
double dist(pe a, pe b) {
return sqrt((a.fi - b.fi) * (a.fi - b.fi) + (a.se - b.se) * (a.se - b.se));
}
void graf() {
S = 0;
D = 2 * n + 1;
for(int i = 1; i <= n; i++) {
A[S].push_back(i);
A[i].push_back(S);
c[S][i] = 1;
}
for(int i = n + 1; i <= 2 * n; i++) {
A[i].push_back(D);
A[D].push_back(i);
c[i][D] = 1;
}
for(int i = 1; i <= n; i++) {
for(int j = n + 1; j <= 2 * n; j++) {
B[i].push_back(j - n);
A[i].push_back(j);
A[j].push_back(i);
c[i][j] = 1;
cost[i][j] = dist(sl[i - 1], ad[j - n - 1]);
cost[j][i] = -cost[i][j];
}
}
}
int l[MAX_N];
int r[MAX_N];
bool viz[MAX_N];
bool pairup(int nod) {
if(viz[nod]) {
return false;
}
viz[nod] = true;
for(auto it : B[nod]) {
if(cost[nod][it + n] > MAX_E) {
continue;
}
if(!r[it]) {
l[nod] = it;
r[it] = nod;
return true;
}
}
for(auto it : B[nod]) {
if(cost[nod][it + n] > MAX_E) {
continue;
}
if(pairup(r[it])) {
l[nod] = it;
r[it] = nod;
return true;
}
}
return false;
}
int cuplaj(double e) {
MAX_E = e;
memset(l, 0, sizeof(l));
memset(r, 0, sizeof(r));
bool change = true;
while(change) {
change = false;
memset(viz, 0, sizeof(viz));
for(int i = 1; i <= n; i++) {
if(!l[i] && pairup(i)) {
change = true;
}
}
}
int sz = 0;
for(int i = 1; i <= n; i++) {
if(l[i]) {
sz++;
}
}
return sz;
}
double search(double st, double dr) {
double ans = 0;
for(int i = 1; i <= 60; i++) {
double mij = (st + dr) / 2.0;
if(cuplaj(mij) == n) {
ans = mij;
dr = mij;
}
else {
st = mij;
}
}
return ans;
}
double maxflow() {
return 0;
}
int main() {
fin >> n;
for(int i = 1; i <= n; i++) {
double a, b;
fin >> a >> b;
sl.push_back(mp(a, b));
}
for(int i = 1; i <= n; i++) {
double a, b;
fin >> a >> b;
ad.push_back(mp(a, b));
}
graf();
MAX_E = search(0.0, 5000.0);
fout << MAX_E << ' ' << maxflow();
return 0;
}