Advertisement
Guest User

Untitled

a guest
Feb 19th, 2020
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.98 KB | None | 0 0
  1. bool kun(int v){
  2.     if(u[v]) return false;
  3.     u[v] = 1;
  4.     for(int i = 1; i <= n; ++i){
  5.         if(c[v][i]) continue;
  6.         if(!sat[i] || kun(sat[i])){
  7.             sat[i] = v;
  8.             return true;
  9.         }
  10.     }
  11.     return false;
  12. }
  13.  
  14. bool try_ven(){
  15.     /// ->create null
  16.     for(int i = 1; i <= n; ++i){
  17.         int mx = INF;
  18.         for(int j = 1; j <= n; ++j){
  19.             mx = min(mx,c[i][j]);
  20.         }
  21.         ans+=mx;
  22.         for(int j = 1; j <= n; ++j){
  23.             c[i][j]-=mx;
  24.         }
  25.     }
  26.     for(int j = 1; j <= n; ++j){
  27.         int mx = INF;
  28.         for(int i = 1; i <= n; ++i)
  29.             mx = min(mx,c[i][j]);
  30.         ans+=mx;
  31.         for(int i = 1; i <= n; ++i)
  32.             c[i][j]-=mx;
  33.     }
  34.     /// <- create null
  35.     /// -> kun
  36.     memset(rows,1,(n+1)*sizeof(rows[0]));
  37.     memset(colls,0,(n+1)*sizeof(colls[0]));
  38.     memset(sat,0,(n+1)*sizeof(sat[0]));
  39.     for(int i = 1; i <= n; ++i){
  40.         kun(i);
  41.         memset(u,0,(n+1)*sizeof(u[0]));
  42.     }
  43.     int cnt = 0;
  44.     for(int i = 1; i <= n; ++i){
  45.         cnt += sat[i]>0;
  46.         rows[sat[i]] = 0;
  47.     }
  48.     if(cnt==n) return  true;
  49.     /// <- kun
  50.     bool any = true;
  51.     ///just for fun
  52.     while(any){
  53.         any = false;
  54.         for(int i = 1; i <= n; ++i){
  55.             for(int j = 1; j <= n; ++j){
  56.                 if(rows[i] && !c[i][j] && !colls[j]){
  57.                     any = true;
  58.                     colls[j] = 1;
  59.                 }
  60.             }
  61.         }
  62.         for(int i = 1; i <= n; ++i){
  63.             for(int j = 1; j <= n; ++j){
  64.                 if(colls[j] && !rows[i] && !c[i][j] && sat[j] && i==sat[j]){
  65.                     any = true;
  66.                     rows[i] = 1;
  67.                 }
  68.             }
  69.         }
  70.     }
  71.     for(int i = 1; i <= n; ++i)
  72.         rows[i] = !rows[i];
  73.     int Min = INF;
  74.     for(int i = 1; i <= n; ++i)
  75.         for(int j = 1; j <= n; ++j)
  76.             if(!colls[j] && !rows[i]) Min = min(Min,c[i][j]);
  77.     for(int i = 1; i <= n; ++i){
  78.         for(int j = 1; j <= n; ++j){
  79.             if(!colls[j] && !rows[i]) c[i][j]-=Min;
  80.             if(colls[j] && rows[i]) c[i][j]+=Min;
  81.         }
  82.     }
  83.     ans+=Min;
  84.     return false;
  85. }
  86. inline void vengerian(){
  87.     while(!try_ven());
  88.     ans = 0;
  89.     /*/for(int i = 1; i <=n; ++i)
  90.         for(int j = 1; j <= n; ++j)
  91.             g[i][j] = maxm-g[i][j];*////if max
  92.     for(int i = 1; i <= n; ++i){
  93.         for(int j = 1; j <= n; ++j){
  94.             if(sat[j]==i) ans+=g[i][j];
  95.         }
  96.     }
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement