为啥啊,我把边权保存为 (x0−x1)2+(y0−y1)2 就不对。
#include <bits/stdc++.h>
using namespace std;
namespace Le0{
#define int long long
const int N=1e3+5,M=5e5+5;
int n,ans,ans2,inf;
int cnt=1,S,T;
struct edge{
int to,ne,w,c;
}e[M];
int head[N],vis[N],dis[N],now[N];
struct node{
int x,y;
}q[N];
int diss(int i,int j){
return 1ll*(q[i].x-q[j].x)*(q[i].x-q[j].x)+1ll*(q[i].y-q[j].y)*(q[i].y-q[j].y);
}
void add(int x,int y,int w,int c){
// cerr<<x<<' '<<y<<" "<<w<<' '<<c<<"\n";
e[++cnt]=(edge){y,head[x],w,c};
head[x]=cnt;
e[++cnt]=(edge){x,head[y],0,-c};
head[y]=cnt;
}
int dfs(int x,int sum){
if(x==T) return sum;
vis[x]=1;
int tot=0;
for(int i=now[x];i&∑i=e[i].ne){
int y=e[i].to;
now[x]=i;
if(!vis[y]&&e[i].w>0&&dis[y]==dis[x]+e[i].c){
int k=dfs(y,min(sum,e[i].w));
if(!k) dis[y]=inf;
e[i].w-=k;
e[i^1].w+=k;
tot+=k;
sum-=k;
ans2+=k*e[i].c;
}
}
vis[x]=0;
return tot;
}
int bfs(){
queue<int> q;
memset(dis,0x3f,sizeof(dis));
memset(vis,0,sizeof(vis));
inf=dis[0];
dis[S]=0;
q.push(S);
vis[S]=1;
while(q.size()){
int x=q.front();q.pop();
vis[x]=0;
for(int i=head[x];i;i=e[i].ne){
int y=e[i].to;
if(e[i].w>0&&dis[y]>dis[x]+e[i].c){
dis[y]=dis[x]+e[i].c;
if(!vis[y]){
q.push(y);
vis[y]=1;
}
}
}
}
return dis[T]!=inf;
}
int main(){
while(cin>>n){
ans=ans2=0;
cnt=1;
memset(head,0,sizeof(head));
S=0;T=2*n+1;
for(int i=1;i<=n;i++){
cin>>q[i].x>>q[i].y;
}
for(int i=1;i<=n;i++){
cin>>q[i+n].x>>q[i+n].y;
}
for(int i=1;i<=n;i++){
for(int j=n+1;j<=n*2;j++){
add(i,j,1,diss(i,j));
}
}
for(int i=1;i<=n;i++) add(S,i,1,0);
for(int i=n+1;i<=n*2;i++) add(i,T,1,0);
while(bfs()){
memcpy(now,head,sizeof(now));
ans+=dfs(S,inf);
}
for(int x=1;x<=n;x++){
for(int i=head[x];i;i=e[i].ne){
int y=e[i].to;
if(y>n&&y<=n*2){
if(e[i].w==0) cout<<y-n<<"\n";
}
}
}
}
return 0;
}
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0);
return Le0::main();
}