为啥啊为啥啊
  • 板块UVA1411 Ants
  • 楼主Le0Chan
  • 当前回复4
  • 已保存回复4
  • 发布时间2024/4/16 19:52
  • 上次更新2024/4/16 21:25:36
查看原帖
为啥啊为啥啊
1024338
Le0Chan楼主2024/4/16 19:52

为啥啊,我把边权保存为 (x0−x1)2+(y0−y1)2(x_0-x_1)^2+(y_0-y_1)^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&&sum;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();
}
2024/4/16 19:52
加载中...