KM algorithm binary graph maximum weighted value matching
#include <iostream>#include<cstring>#include<cstdio>#include<cmath>Const intMAXN =356;Const intINF = (1<< to)-1;intW[MAXN][MAXN];intLX[MAXN],LY[MAXN];intLINKY[MAXN];intVISX[MAXN],VISY[MAXN];intSLACK[MAXN];intNx,ny;BOOLFindintx) {Visx[x]=true; for(inty =0; Y < NY; y++) { if(Visy[y])Continue; intt = lx[x] + ly[y]-W[x][y]; if(t==0) {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; }intKM () {inti,j; memset (Linky,-1,sizeof(Linky)); memset (ly,0,sizeof(ly)); for(i =0; I < NX; i++) for(j =0, lx[i] =-inf; J < NY; J + +) if(W[i][j] >Lx[i]) lx[i]=W[i][j]; for(intx =0; x < NX; X + +) { for(i =0; i < NY; i++) Slack[i]=INF; while(true) {memset (VISX,0,sizeof(VISX)); memset (Visy,0,sizeof(Visy)); if(Find (x)) Break; intD =INF; for(i =0; i < NY; i++) { if(!visy[i] && d >Slack[i]) d=Slack[i]; } for(i =0; I < NX; i++) { if(Visx[i]) lx[i]-=D; } for(i =0; i < NY; i++) { if(Visy[i]) ly[i]+=D; ElseSlack[i]-=D; } } } intresult =0; for(i =0; i < NY; i++) if(linky[i]>-1) Result+=W[linky[i]][i]; returnresult;}intMain () {intN; while(~SCANF ("%d",&N)) {NX=ny=N; for(intI=0; i<n;i++) for(intj=0; j<n;j++) { intx; scanf ("%d",&x); W[I][J]=x; } printf ("%d\n", KM ()); } return 0;}
HDU 2255 Ben-off make money