1 #include<iostream> 2 #include<cstring> 3 #define N 500 4 using namespace std; 5 6 int n,w[N][N]; 7 int lx[N],ly[N],f[N];bool vx[N],vy[N]; 8 9 int Search(int k){ 10 vx[k]=1; 11 12 for(int i=1;i<=n;++i) 13 if(!vy[i]&&lx[k]+ly[i]==w[k][i]) 14 { 15 if(f[i]==-1||Search(f[i])) 16 {f[i]=k;return 1;} 17 } 18 return 0; 19 } 20 21 long KM(int p){ 22 if(!p) 23 { 24 for(int i=1;i<=n;++i) 25 for(int j=1;j<=n;++j) 26 w[i][j]=-w[i][j]; 27 } 28 29 for(int i=1;i<=n;++i) 30 { 31 lx[i]=-100000000; 32 for(int j=1;j<=n;++j) 33 if(lx[i]<w[i][j]) lx[i]=w[i][j]; 34 ly[i]=0; 35 } 36 37 memset(f,-1,sizeof(f)); 38 for(int i=1;i<=n;++i) 39 { 40 while(1) 41 { 42 memset(vx,0,sizeof(vx)); 43 memset(vy,0,sizeof(vy)); 44 45 if(Search(i)) break; 46 47 int mi=100000000; 48 for(int j=1;j<=n;++j) 49 if(vx[j]) 50 for(int k=1;k<=n;++k) 51 if(!vy[k]&&lx[j]+ly[k]-w[j][k]<mi) 52 mi=lx[j]+ly[k]-w[j][k]; 53 54 if(mi==0) {cout<<"NO ANSWER!"<<endl;return 0;} 55 for(int j=1;j<=n;++j) 56 { 57 if(vx[j]) lx[j]-=mi; 58 if(vy[j]) ly[j]+=mi; 59 } 60 } 61 } 62 63 int sum=0; 64 for(int i=1;i<=n;++i) 65 if(f[i]>0) 66 sum+=w[f[i]][i]; 67 68 if(!p) return -sum; 69 return sum; 70 } 71 72 int main() 73 { 74 cin>>n; 75 for(int i=1;i<=n;++i) 76 for(int j=1;j<=n;++j) 77 cin>>w[i][j]; 78 79 cout<<KM(1)<<endl; //最大 80 cout<<KM(0)<<endl; //最小 81 system("pause"); 82 return 0; 83 84 }