KM算法(3)poj3565

来源:互联网 发布:第三方打印软件 编辑:程序博客网 时间:2024/05/16 12:28
#include<iostream>#include<map>#include<string>#include<algorithm>#include<bitset>#include<cassert>#include<cstring>#include<cmath>#include<cstdio>#include<queue>#include<stack>#include<vector>#include<ctime>#include<functional>#include<set> #include<cctype>#include<cstdlib>using namespace std;const double eps=1e-6;const int maxn = 128;const int maxe = 2*400*400;const double INF = 0xffffffffffff;typedef unsigned long long ULL;int n,antx[maxn],anty[maxn],appx[maxn],appy[maxn];inline double dist(double x1,double y1,double x2,double y2){return -sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}double w[maxn][maxn],lx[maxn],ly[maxn],slack[maxn];int linky[maxn],visx[maxn],visy[maxn];bool find(int x){visx[x] = true;for(int y = 0; y < n; ++y){if(visy[y]) continue;double t = lx[x] + ly[y] - w[x][y];if(fabs(t)<=eps){visy[y] = true;if(linky[y]==-1 || find(linky[y])){linky[y]=x;return true;}}else{if(slack[y] > t) slack[y]=t;}}return false;}void KM(){memset(linky,-1,sizeof(linky));memset(lx,0,sizeof(lx));memset(ly,0,sizeof(ly));for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){if(lx[i] < w[i][j]) lx[i]=w[i][j];}}for(int x = 0;x < n; ++x){for(int i = 0 ; i < n; ++i){slack[i] = INF;}while(true){memset(visx,0,sizeof(visx));memset(visy,0,sizeof(visy));if(find(x)) break;double mins = INF;for(int i = 0; i < n; ++i){if(!visy[i]){if(mins > slack[i]) mins = slack[i];}}for(int i = 0; i < n; ++i){if(visy[i]) ly[i] += mins;else slack[i] -= mins;if(visx[i]) lx[i] -= mins;}}}}int main(){//freopen("in.txt","r",stdin);scanf("%d",&n);for(int i = 0; i < n; ++i){scanf("%d%d",antx+i,anty+i);}for(int i = 0; i < n; ++i){scanf("%d%d",appx+i,appy+i);}for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){w[i][j]=dist(antx[i],anty[i],appx[j],appy[j]);}}KM();for(int i = 0; i < n; ++i){for(int j = 0; j < n; ++j){if(linky[j] == i){printf("%d\n",j+1);break;}}}return 0;}

原创粉丝点击