Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <memory.h>
- #define min(a,b) ((a)<(b)?(a):(b))
- using namespace std;
- int p[155][155], pp[155][155], c[155][155];
- bool g[155][155], a[303][303];
- int n,i,j,k,l,x,y;
- bool xt[155], yt[155];
- int f[155], fx[155];
- bool u[300], u2[300];
- bool dfs_kuhn(int v){
- if(u[v]) return false;
- u[v]=1;
- int i;
- for(i=0;i<n;++i) if(g[v][i]){
- if(f[i]==-1 || dfs_kuhn(f[i])){
- f[i]=v;
- return true;
- }
- }
- return false;
- }
- void dfs_d(int v){
- if(u[v]) return;
- if(v<n) xt[v]=1; else yt[v-n]=1;
- u[v]=1;
- int i;
- for(i=0;i<n+n;++i) if(a[v][i] && !u[i]){
- dfs_d(i);
- }
- }
- int main(){
- //freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);
- cin>>n;
- for(i=0;i<n;++i)
- for(j=0;j<n;++j){
- cin>>c[i][j];
- }
- for(i=0;i<n;++i)
- for(j=0;j<n;++j){
- p[i][j]=0;
- for(k=0;k<n;++k) if(k!=j) p[i][j]+=c[i][k];
- for(k=0;k<n;++k) if(k!=i) p[i][j]+=c[k][j];
- pp[i][j]=p[i][j];
- }
- for(i=0;i<n;++i){
- x = 1e9;
- for(j=0;j<n;++j) x = min(x,p[i][j]);
- for(j=0;j<n;++j) p[i][j]-=x;
- }
- for(i=0;i<n;++i){
- x = 1e9;
- for(j=0;j<n;++j) x = min(x,p[j][i]);
- for(j=0;j<n;++j) p[j][i]-=x;
- }
- while(1){
- for(i=0;i<n;++i)
- for(j=0;j<n;++j) g[i][j]=!p[i][j];
- memset(f,255,sizeof(f));
- memset(fx,255,sizeof(fx));
- memset(u2,0,sizeof(u2));
- memset(a,0,sizeof(a));
- for(i=0;i<n;++i)
- for(j=0;j<n;++j) if(g[i][j] && f[j]==-1){
- f[j]=i;
- u2[i]=1;
- break;
- }
- for(i=0;i<n;++i) if(!u2[i]){
- memset(u,0,sizeof(u));
- dfs_kuhn(i);
- }
- for(i=0;i<n && f[i]>=0;++i);
- if(i==n) break;
- for(i=0;i<n;++i)
- for(j=0;j<n;++j) if(g[i][j]){
- a[i][j+n]=1;
- a[j+n][i+n]=0;
- }
- for(i=0;i<n;++i) if(f[i]>=0){
- a[f[i]][i+n]=0;
- a[i+n][f[i]]=1;
- fx[f[i]]=i;
- }
- memset(u,0,sizeof(u));
- memset(xt,0,sizeof(xt));
- memset(yt,0,sizeof(yt));
- for(i=0;i<n;++i){
- if(fx[i]<0) dfs_d(i);
- }
- x=1e9;
- for(i=0;i<n;++i) if(xt[i])
- for(j=0;j<n;++j) if(!yt[j]){
- x = min(x,p[i][j]);
- }
- if(x==1e9) x=0;
- for(i=0;i<n;++i) if(xt[i]){
- for(j=0;j<n;++j) p[i][j]-=x;
- }
- for(i=0;i<n;++i) if(yt[i]){
- for(j=0;j<n;++j) p[j][i]+=x;
- }
- }
- x=0;
- for(i=0;i<n;++i) if(f[i]>=0) x+=pp[f[i]][i];
- cout<<x/2<<endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment