Cod sursa(job #783035)

Utilizator ctlin04UAIC.VlasCatalin ctlin04 Data 1 septembrie 2012 23:57:41
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<fstream>
using namespace std;
typedef struct celula{
             int nod;
             celula *next;
             }*lista;
lista graf[205],v;
bool viz[205],cap[205][205],ok;
int dist[205],tata[205],st[10000],cost[205][205],sol,n;

inline void update(){
      int nod=2*n+1;
       sol+=dist[nod];
      while (tata[nod]!=nod){
            cap[tata[nod]][nod]=0;
            cap[nod][tata[nod]]=1;
            nod=tata[nod];
            }
}

inline void ford(){
       int cp,coada;
       cp=coada=1; st[cp]=0; 
        for (int i=0; i<=2*n+1; ++i){ viz[i]=0; dist[i]=1000000000;} viz[0]=1; dist[0]=0; 
       while (cp<=coada){
             for (lista p=graf[st[cp]];p;p=p->next)
              if (cap[st[cp]][p->nod]==1&&dist[st[cp]]+cost[st[cp]][p->nod]<dist[p->nod]){
               dist[p->nod]=dist[st[cp]]+cost[st[cp]][p->nod];
               tata[p->nod]=st[cp];
               if (viz[p->nod]==0){++coada; st[coada]=p->nod; viz[p->nod]=1;}
               }
             viz[st[cp]]=0; ++cp;
        }
       if (dist[2*n+1]==1000000000) ok=false;
}

int main(void){
    ifstream fin("cc.in");
    ofstream fout("cc.out");
    int i,j,x;
    fin>>n;
    for (i=1; i<=n; ++i){
     cap[0][i]=true; v=new celula; v->nod=i; v->next=graf[0]; graf[0]=v;
                     v=new celula; v->nod=0; v->next=graf[i]; graf[i]=v;
     cap[i+n][2*n+1]=true; v=new celula; v->nod=2*n+1; v->next=graf[i+n]; graf[i+n]=v; 
                           v=new celula; v->nod=i+n; v->next=graf[2*n+1]; graf[2*n+1]=v;      
     for (j=1; j<=n; ++j){
         fin>>x; cost[i][j+n]=x; cost[j+n][i]=-x; cap[i][j+n]=true; 
         v=new celula; v->nod=j+n; v->next=graf[i]; graf[i]=v;
         v=new celula; v->nod=i; v->next=graf[j+n]; graf[j+n]=v;
         }
      }
      ok=true;
      while (ok){ ford(); if (ok) update(); }
     fout<<sol;
  return(0);
}