Cod sursa(job #1487210)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 16 septembrie 2015 14:35:19
Problema Cc Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.03 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;
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);
}