Cod sursa(job #723195)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 25 martie 2012 00:56:45
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <cstdio>
#define N 205
#define inf 1999999999
using namespace std;
int n,cap[N][N],cost[N][N],flux[N][N],tata[N],dist[N],sol;
bool viz[N];
int S,D;
struct nod{ int val; nod *urm; }*G[N];
struct coada{ int v; coada *next; }*st,*dr;
void add(int x,int y)
{
nod *aux;
aux=new nod; aux->val=y; aux->urm=G[x]; G[x]=aux;
}
void read()
{ int i,j,x;
freopen("cc.in","r",stdin); scanf("%d\n",&n);
for(i=1;i<=n;++i)
    for(j=1;j<=n;++j)
        {
        scanf("%d ",&x);
        add(i,j+n); add(j+n,i);
        cost[i][j+n]=x; cost[j+n][i]=-x; cap[i][j+n]=1;
        }
fclose(stdin);
}
void super_source()
{ int i;
S=0;
for(i=1;i<=n;++i)
    {
    add(S,i); add(i,S);
    cap[S][i]=1;
    }
}
void super_destination()
{ int i;
D=2*n+1;
for(i=1;i<=n;++i)
    {
    add(n+i,D); add(D,n+i);
    cap[n+i][D]=1;
    }
}
inline int min(int x,int y)
{
if(x<y)return x; else return y; return 0;
}
int bellman_ford()
{ int i,x,y;
  nod *aux;
  coada *adr;
for(i=0;i<=2*n+1;++i)
    {
    tata[i]=0; viz[i]=0; dist[i]=inf;
    }
viz[S]=1; dist[S]=0;
adr=new coada; adr->v=S; adr->next=NULL; st=dr=adr;
while(st)
    {
    x=st->v; viz[x]=0;
    for(aux=G[x];aux!=NULL;aux=aux->urm)
        {
        y=aux->val;
        if(cap[x][y]>flux[x][y]&&dist[y]>dist[x]+cost[x][y])
            {
            dist[y]=dist[x]+cost[x][y];
            tata[y]=x;
            if(!viz[y])
                { adr=new coada; adr->v=y; adr->next=NULL; dr->next=adr; dr=adr;
                  viz[y]=1;
                }
            }
        }
    adr=st; st=st->next; delete adr;
    }
if(dist[D]!=inf)return 1;
return 0;
}
void solve()
{ bool gata;
  int fm,i;
gata=false;
while(bellman_ford()&&!gata)
    {
    fm=inf; gata=true;
    for(i=D;i!=S;i=tata[i])
        fm=min(fm,cap[tata[i]][i]-flux[tata[i]][i]);
    if(fm)
        {
         gata=false;
         for(i=D;i!=S;i=tata[i])
            {
            flux[tata[i]][i]+=fm;
            flux[i][tata[i]]-=fm;
            }
        }
    }
}
void reconstr_sol()
{ int i,j;
sol=0;
for(i=1;i<=n;++i)
    for(j=n+1;j<=2*n;++j)
        if(flux[i][j]==1)sol+=cost[i][j];
}
void write()
{
freopen("cc.out","w",stdout); printf("%d",sol); fclose(stdout);
}
int main()
{
read();
super_source();
super_destination();
solve();
reconstr_sol();
write();
return 0;
}