Cod sursa(job #1902496)

Utilizator Mihai9Oniga Mihai Mihai9 Data 4 martie 2017 17:11:56
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include<stdio.h>
int k,i,j,n,v[202][202],c[202][202],f[202][202],w[100001],u[202],g[202],p,q,t,l,r,e;
int main() {
    freopen("cc.in","r",stdin),freopen("cc.out","w",stdout),scanf("%d",&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++){scanf("%d",&k),v[i][n+j+1]=k,v[n+j+1][i]=-k,c[i][n+j+1]=1;}
    for(i=1;i<=n;i++) c[0][i]=c[i+n+1][n+1]=1,v[0][i]=v[i+n+1][n+1]=0;
    while(1){
        for(i=1;i<=2*n+1;i++) u[i]=0,g[i]=100001;
        for(g[0]=p=q=0,w[q++]=0;p<q;) {
            t=w[p++];
            if(t&&t<=n){
                for(i=n+1;i<=2*n+1;i++)
                if(f[t][i]<c[t][i]&&g[i]>g[t]+v[t][i])
                    w[q++]=i,u[i]=t,g[i]=g[t]+v[t][i];
            }
            else
                for(i=1;i<=n+1;i++)
                if(f[t][i]<c[t][i]&&g[i]>g[t]+v[t][i])
                    w[q++]=i,u[i]=t,g[i]=g[t]+v[t][i];
        }
        if(!u[n+1])break;
        for(e+=g[n+1],l=n+1;l;l=u[l])f[u[l]][l]++,f[l][u[l]]--;
    }
    printf("%d",e);
}