1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
#include<iostream> #include<vector> #include<cstring> #define N 110 using namespace std; int n,i,j; int l[N],w[N][N],lx[N],ly[N],s[N],vx[N],vy[N]; inline int (){ int p=0; char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') p=p*10+c-48,c=getchar(); return p; } inline int max(int a,int b){return (a>b)?a:b;} inline bool dfs(int P){ int i=0,t=0; vx[P]=1; for (i=1;i<=n;i++){ if (vy[i]) continue; t=lx[P]+ly[i]-w[P][i]; if (t==0){ vy[i]=1; if (l[i]==-1||dfs(l[i])) {l[i]=P; return true;} } else if (s[i]>t) s[i]=t; } return false; } inline void KM(){ int i=0,j=0,x=0,d=0,ans=0; memset(l,-1,sizeof(l)); memset(ly,0,sizeof(ly)); for (x=1;x<=n;x++){ memset(s,0x3f3f3f3f,sizeof(s)); while (1){ memset(vx,0,sizeof(vx)); memset(vy,0,sizeof(vy)); if (dfs(x)) break; d=0x3f3f3f3f; for (i=1;i<=n;i++) if (!vy[i]&&d>s[i]) d=s[i]; for (i=1;i<=n;i++) if (vx[i]) lx[i]-=d; for (i=1;i<=n;i++) if (vy[i]) ly[i]+=d; else s[i]-=d; } } for (i=1;i<=n;i++) if (l[i]>-1) ans+=w[l[i]][i]; if (ans<0) printf("%dn",-ans); else printf("%dn",ans); } int main(){ n=read(); for (i=1;i<=n;i++) lx[i]=-0x3f3f3f3f; for (i=1;i<=n;i++) for (j=1;j<=n;j++){ w[i][j]=-read(); lx[i]=max(lx[i],w[i][j]); } KM(); for (i=1;i<=n;i++) lx[i]=0; for (i=1;i<=n;i++) for (j=1;j<=n;j++){ w[i][j]=-w[i][j]; lx[i]=max(lx[i],w[i][j]); } KM(); return 0; }
|
近期评论