#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define maxn 110
#define esp 1e-8
double inf=1000000.0;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool dayu(double a,double b)
{
return a-esp>b;
}
double lx[maxn],ly[maxn];
bool visx[maxn],visy[maxn];
double w[maxn][maxn];
double slack[maxn];
int n,nx,ny;
double wx[maxn],wy[maxn];
double bx[maxn],by[maxn];
int match[maxn];
int match1[maxn];
bool dfs(int x)
{
visx[x]=1;
for(int y=1;y<=ny;y++)
{
if(!visy[y])
{
double temp=lx[x]+ly[y]-w[x][y];
if(fabs(temp)<esp)
{
visy[y]=1;
if(match[y]==-1||dfs(match[y]))
{
match[y]=x;
match1[x]=y;
return true;
}
}
else
{
if(dayu(slack[y],temp))
{
slack[y]=temp;
}
}
}
else continue;
}
return false;
}
void km()
{
memset(match,-1,sizeof(match));
memset(ly,0,sizeof(ly));
for(int i=1;i<=nx;i++)
{
lx[i]=-inf;
for(int j=1;j<=ny;j++)
if(dayu(w[i][j],lx[i]))
lx[i]=w[i][j];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=ny;j++)slack[j]=inf;
while(true)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if(dfs(i))break;
double d=inf;
for(int j=1;j<=ny;j++)
if(!visy[j]&&dayu(d,slack[j]))
d=slack[j];
for(int j=1;j<=nx;j++)
if(visx[j])lx[j]-=d;
for(int j=1;j<=ny;j++)
if(visy[j])ly[j]+=d;
else slack[j]-=d;
}
}
for(int i=1;i<=nx;i++)
printf("%d\n",match1[i]);
}
int main()
{
for(;scanf("%d",&n)==1;)
{
nx=ny=n;
for(int i=1;i<=nx;i++)scanf("%lf%lf",&wx[i],&wy[i]);
for(int i=1;i<=ny;i++)scanf("%lf%lf",&bx[i],&by[i]);
for(int i=1;i<=nx;i++)
for(int j=1;j<=ny;j++)
w[i][j]=0.0-dis(wx[i],wy[i],bx[j],by[j]);
km();
// printf("\n");
}
return 0;
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define maxn 110
#define esp 1e-8
double inf=1000000.0;
double dis(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}
bool dayu(double a,double b)
{
return a-esp>b;
}
double lx[maxn],ly[maxn];
bool visx[maxn],visy[maxn];
double w[maxn][maxn];
double slack[maxn];
int n,nx,ny;
double wx[maxn],wy[maxn];
double bx[maxn],by[maxn];
int match[maxn];
int match1[maxn];
bool dfs(int x)
{
visx[x]=1;
for(int y=1;y<=ny;y++)
{
if(!visy[y])
{
double temp=lx[x]+ly[y]-w[x][y];
if(fabs(temp)<esp)
{
visy[y]=1;
if(match[y]==-1||dfs(match[y]))
{
match[y]=x;
match1[x]=y;
return true;
}
}
else
{
if(dayu(slack[y],temp))
{
slack[y]=temp;
}
}
}
else continue;
}
return false;
}
void km()
{
memset(match,-1,sizeof(match));
memset(ly,0,sizeof(ly));
for(int i=1;i<=nx;i++)
{
lx[i]=-inf;
for(int j=1;j<=ny;j++)
if(dayu(w[i][j],lx[i]))
lx[i]=w[i][j];
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=ny;j++)slack[j]=inf;
while(true)
{
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if(dfs(i))break;
double d=inf;
for(int j=1;j<=ny;j++)
if(!visy[j]&&dayu(d,slack[j]))
d=slack[j];
for(int j=1;j<=nx;j++)
if(visx[j])lx[j]-=d;
for(int j=1;j<=ny;j++)
if(visy[j])ly[j]+=d;
else slack[j]-=d;
}
}
for(int i=1;i<=nx;i++)
printf("%d\n",match1[i]);
}
int main()
{
for(;scanf("%d",&n)==1;)
{
nx=ny=n;
for(int i=1;i<=nx;i++)scanf("%lf%lf",&wx[i],&wy[i]);
for(int i=1;i<=ny;i++)scanf("%lf%lf",&bx[i],&by[i]);
for(int i=1;i<=nx;i++)
for(int j=1;j<=ny;j++)
w[i][j]=0.0-dis(wx[i],wy[i],bx[j],by[j]);
km();
// printf("\n");
}
return 0;
}
//二分图