Guest User

Untitled

a guest
Dec 15th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.30 KB | None | 0 0
  1. #include <iostream>
  2. #include <memory.h>
  3. #define min(a,b) ((a)<(b)?(a):(b))
  4. using namespace std;
  5.  
  6. int p[155][155], pp[155][155], c[155][155];
  7. bool g[155][155], a[303][303];
  8. int n,i,j,k,l,x,y;
  9. bool xt[155], yt[155];
  10. int f[155], fx[155];
  11. bool u[300], u2[300];
  12.  
  13. bool dfs_kuhn(int v){
  14.     if(u[v]) return false;
  15.     u[v]=1;
  16.     int i;
  17.     for(i=0;i<n;++i) if(g[v][i]){
  18.         if(f[i]==-1 || dfs_kuhn(f[i])){
  19.             f[i]=v;
  20.             return true;
  21.         }
  22.     }
  23.     return false;
  24. }
  25.  
  26. void dfs_d(int v){
  27.     if(u[v]) return;
  28.     if(v<n) xt[v]=1; else yt[v-n]=1;
  29.     u[v]=1;
  30.     int i;
  31.     for(i=0;i<n+n;++i) if(a[v][i] && !u[i]){
  32.         dfs_d(i);
  33.     }
  34. }
  35.  
  36. int main(){
  37.     //freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);
  38.    
  39.     cin>>n;
  40.    
  41.     for(i=0;i<n;++i)
  42.     for(j=0;j<n;++j){
  43.         cin>>c[i][j];
  44.     }
  45.    
  46.    
  47.     for(i=0;i<n;++i)
  48.     for(j=0;j<n;++j){
  49.         p[i][j]=0;
  50.         for(k=0;k<n;++k) if(k!=j) p[i][j]+=c[i][k];
  51.         for(k=0;k<n;++k) if(k!=i) p[i][j]+=c[k][j];
  52.         pp[i][j]=p[i][j];
  53.     }
  54.    
  55.    
  56.     for(i=0;i<n;++i){
  57.         x = 1e9;
  58.         for(j=0;j<n;++j) x = min(x,p[i][j]);
  59.         for(j=0;j<n;++j) p[i][j]-=x;
  60.     }
  61.    
  62.     for(i=0;i<n;++i){
  63.         x = 1e9;
  64.         for(j=0;j<n;++j) x = min(x,p[j][i]);
  65.         for(j=0;j<n;++j) p[j][i]-=x;
  66.     }
  67.    
  68.    
  69.    
  70.     while(1){
  71.        
  72.         for(i=0;i<n;++i)
  73.         for(j=0;j<n;++j) g[i][j]=!p[i][j];
  74.        
  75.         memset(f,255,sizeof(f));
  76.         memset(fx,255,sizeof(fx));
  77.         memset(u2,0,sizeof(u2));
  78.         memset(a,0,sizeof(a));
  79.        
  80.         for(i=0;i<n;++i)
  81.         for(j=0;j<n;++j) if(g[i][j] && f[j]==-1){
  82.             f[j]=i;
  83.             u2[i]=1;
  84.             break;
  85.         }
  86.        
  87.         for(i=0;i<n;++i) if(!u2[i]){
  88.             memset(u,0,sizeof(u));
  89.             dfs_kuhn(i);
  90.         }
  91.        
  92.         for(i=0;i<n && f[i]>=0;++i);
  93.         if(i==n) break;
  94.        
  95.         for(i=0;i<n;++i)
  96.         for(j=0;j<n;++j) if(g[i][j]){
  97.             a[i][j+n]=1;
  98.             a[j+n][i+n]=0;
  99.         }
  100.        
  101.         for(i=0;i<n;++i) if(f[i]>=0){
  102.             a[f[i]][i+n]=0;
  103.             a[i+n][f[i]]=1;
  104.             fx[f[i]]=i;
  105.         }
  106.        
  107.        
  108.         memset(u,0,sizeof(u));
  109.         memset(xt,0,sizeof(xt));
  110.         memset(yt,0,sizeof(yt));
  111.         for(i=0;i<n;++i){
  112.             if(fx[i]<0) dfs_d(i);
  113.         }
  114.        
  115.        
  116.         x=1e9;
  117.         for(i=0;i<n;++i) if(xt[i])
  118.         for(j=0;j<n;++j) if(!yt[j]){
  119.             x = min(x,p[i][j]);
  120.         }
  121.        
  122.         if(x==1e9) x=0;
  123.        
  124.         for(i=0;i<n;++i) if(xt[i]){
  125.             for(j=0;j<n;++j) p[i][j]-=x;
  126.         }
  127.        
  128.         for(i=0;i<n;++i) if(yt[i]){
  129.             for(j=0;j<n;++j) p[j][i]+=x;
  130.         }
  131.        
  132.     }
  133.    
  134.    
  135.     x=0;
  136.     for(i=0;i<n;++i) if(f[i]>=0) x+=pp[f[i]][i];
  137.    
  138.     cout<<x/2<<endl;
  139.    
  140.     return 0;
  141. }
Add Comment
Please, Sign In to add comment