Link:
http://acm.hdu.edu.cn/showproblem.php?pid=2255
Code:
#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespacestd;#defineN 550#defineINF 0x3f3f3f3fintN;intG[n][n], Lx[n], ly[n];//the top label of the X collectionintVisx[n], Visy[n], s[n], used[n];//S is to find D, visx[i]x I have not been augmentedBOOLFind (intU//Augmented Road{Visx[u]=1; for(intI=1; i<=n; i++) { if(!visy[i] && lx[u]+ly[i]==G[u][i]) {Visy[i]=1; if(!used[i] | |Find (Used[i])) {Used[i]=u; return true; } } ElseS[i]= Min (S[i], lx[u]+ly[i]-G[u][i]); } return false;}intKM () {memset (used,0,sizeof(used)); memset (LX,0,sizeof(LX)); memset (ly,0,sizeof(ly)); for(intI=1; i<=n; i++) for(intj=1; j<=n; J + +) Lx[i]=Max (Lx[i], g[i][j]); for(intI=1; i<=n; i++) { for(intj=1; j<=n; J + +) S[j]=INF; while(1) {memset (VISX,0,sizeof(VISX)); memset (Visy,0,sizeof(Visy)); if(Find (i)) Break; intD =INF; for(intj=1; j<=n; J + +) if(!Visy[j]) d=min (d, s[j]); for(intj=1; j<=n; J + +) { if(Visx[j]) lx[j]-=D; if(Visy[j]) ly[j]+=D; } } } intres=0; for(intI=1; i<=n; i++) Res+=G[used[i]][i]; returnRes;}intMain () { while(SCANF ("%d", &n)! =EOF) { intI, J; memset (G,0,sizeof(G)); for(i=1; i<=n; i++) for(j=1; j<=n; J + +) scanf ("%d", &G[i][j]); printf ("%d\n", KM ()); } return 0;}
(binary match) Ben-off earns a lot of money--hdu--2255