比赛 |
20110723 |
评测结果 |
WWWWWW |
题目名称 |
圣诞节 |
最终得分 |
0 |
用户昵称 |
.Xmz |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2011-07-23 11:48:40 |
显示代码纯文本
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int oo=1000000000;
struct point
{
int x,y;
}P[1111];
int cn;
struct dis
{
int x,y,dis;
}cost[255555];
bool cmp(const dis &a,const dis &b)
{
return a.dis < b.dis;
}
int n;
void init()
{
scanf("%d",&n);
for (int i=1;i<=2*n;i++)
scanf("%d%d",&P[i].x,&P[i].y);
for (int i=1;i<=n;i++)
for (int j=n+1;j<=2*n;j++)
{
cost[++cn].x=i;cost[cn].y=j;
cost[cn].dis=(P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y);
}
sort(cost+1,cost+cn+1,cmp);
}
struct edge
{
int t,c;
edge *next,*op;
}E[888888],*V[1111];
int eh;
inline void addedge(int a,int b,int c)
{
E[++eh].next=V[a]; V[a]=E+eh; V[a]->t=b; V[a]->c=c;
E[++eh].next=V[b]; V[b]=E+eh; V[b]->t=a; V[b]->c=0;
V[a]->op=V[b]; V[b]->op=V[a];
}
int ansflow,S,T,pn;
int d[1111],vd[1111];
int dfs(int u,int flow)
{
if (u==T) return flow;
int now=0;
for (edge *e=V[u];e;e=e->next)
if (e->c && d[e->t]+1==d[u])
{
int t=dfs(e->t,min(flow-now,e->c));
e->c -= t;
e->op->c += t;
now += t;
if (now==flow) return now;
}
if (d[S]>=pn) return now;
if (--vd[d[u]]==0) d[S]=pn;
vd[++d[u]]++;
return now;
}
void SAPflow()
{
d[S]=3;d[T]=0;
for (int i=1;i<=n;i++) d[i]=2,d[i+n]=1;
vd[3]=vd[0]=1;vd[2]=vd[1]=n;
while (d[S]<pn)
{
ansflow+=dfs(S,oo);
}
}
int check1()
{
int lim=0;
for (int i=1;i<=cn;i++)
{
addedge(cost[i].x,cost[i].y,cost[i].dis);
if ( i % n == 0 )
{
SAPflow();
if (ansflow==n) {lim=i;break;}
}
}
lim-=n;eh=0;memset(V,0,sizeof(V));ansflow=0;
for (int i=1;i<=lim;i++)
addedge(cost[i].x,cost[i].y,cost[i].dis);
for (int i=1;i<=n;i++)
{
addedge(S,i,1);
addedge(i+n,T,1);
}
return lim;
}
int check2(int lim)
{
for (int i=lim+1;i<=lim+n;i++)
{
addedge(cost[i].x,cost[i].y,cost[i].dis);
SAPflow();
if (ansflow==n) return cost[i].dis;
}
return 0;
}
void solve()
{
S=0;T=2*n+1;pn=2*n+2;
for (int i=1;i<=n;i++)
{
addedge(S,i,1);
addedge(i+n,T,1);
}
printf( "%d\n" , check2(check1()) );
}
int main()
{
freopen("christmas.in","r",stdin);
freopen("christmas.out","w",stdout);
init();
solve();
return 0;
}