| 比赛 | 
    20120418x | 
    评测结果 | 
    AAAAAA | 
    | 题目名称 | 
    圣诞节 | 
    最终得分 | 
    100 | 
    | 用户昵称 | 
    王者自由 | 
    运行时间 | 
    0.000 s  | 
    | 代码语言 | 
    C++ | 
    内存使用 | 
    0.00 MiB  | 
    | 提交时间 | 
    2012-04-18 14:56:45 | 
显示代码纯文本
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 500 + 10;
int n, m, h[2][N], a[2][N], F[N][N];
int x[N], y[N], l[N*N], u, s; 
bool g[N];
inline int sqr(int x) {
    return x * x;
}
bool DFS(int a) {
    for(int i=1; i<=n; i++)
        if(F[a][i] <= u && !g[i]) {
            g[i] = 1;
            if(!y[i] || DFS(y[i])) {
                y[i] = a, x[a] = i;
                return true;
            }
        }
    return false;
}
int main() {
    freopen("christmas.in", "r", stdin);
    freopen("christmas.out", "w", stdout);
    scanf("%d", &n);
    for(int i=1; i<=n; i++)
        scanf("%d %d", h[0]+i, a[0]+i);
    for(int i=1; i<=n; i++)
        scanf("%d %d", h[1]+i, a[1]+i);
    for(int i=1; i<=n; i++)
        for(int j=1; j<=n; j++)
            F[i][j] = l[++m] = sqr(h[0][i] - h[1][j]) + sqr(a[0][i] - a[1][j]);
    sort(l+1, l+m+1);
    for(int i=n; i!=m; i++) {
        while(l[i] == l[i-1]) i++;
        u = l[i];
        for(int j=1; j<=n; j++) if(!x[j]) {
            for(int k=1; k<=n; k++) g[k] = 0;
            if(DFS(j)) s++;
            if(s == n) {
                printf("%d\n", u);
                return 0;
            }
        }
    }
    return 0;
}