km模板
#include <stdio.h>
#include<vector>
#include<queue>
#include<bits/stdc++.h>
using namespace std;
#define eps 1e-7
const double inf=999999999999999.;
struct Dian
{
double x,y;
}white[300*300],black[300*300];
double g[300][300];
int f[300*300],visx[300*300],visy[300*300],n;
double lx[300*300],ly[300*300],slack[300*300];
int dfs(int x)
{
visx[x]=1;
for(int i=0;i<n;i++)
{
if(visy[i])continue;
double tmp=lx[x]+ly[i]-g[x][i];
if(fabs(tmp)<eps)
{
visy[i]=1;
if(f[i]==-1||dfs(f[i]))
{
f[i]=x;
return 1;
}
}
else slack[i]=min(tmp,slack[i]);
}
return 0;
}
void KM()
{
memset(f,-1,sizeof f);
memset(ly,0,sizeof ly);
for(int i=0;i<n;i++)
{
lx[i]=-inf;
for(int j=0;j<n;j++)
lx[i]=max(lx[i],g[i][j]);
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
slack[j]=inf;
while(1)
{
memset(visx,0,sizeof visx);
memset(visy,0,sizeof visy);
if(dfs(i))break;
double d=inf;
for(int j=0;j<n;j++) if(!visy[j])d=min(d,slack[j]);
for(int j=0;j<n;j++)
if(visx[j])lx[j]-=d;
for(int j=0;j<n;j++)
if(visy[j])ly[j]+=d;
else slack[j]-=d;
}
}
}
double Dist(Dian a,Dian b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int main()
{
bool first=false;
while(~scanf("%d",&n))
{
if(first) putchar(10);
else first=true;
for(int i=0;i<n;i++)
scanf("%lf%lf",&white[i].x,&white[i].y);
for(int i=0;i<n;i++)
scanf("%lf%lf",&black[i].x,&black[i].y);
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
//int x1=b[i].x,y1=b[i].y,x2=h[j].x,y2=h[j].y;
g[i][j]=-Dist(white[j],black[i]);
}
}
KM();
for(int i=0;i<n;i++)
{
printf("%d\n",f[i]+1);
}
}
}