Cod sursa(job #190429)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 22 mai 2008 16:14:11
Problema Cc Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
const int NMAX=202,Inf=9999999;
vector<int> a[NMAX];
int n,c[NMAX][NMAX],r[NMAX][NMAX],dmin[NMAX],sol;
ifstream f("cc.in");
ofstream g("cc.out");
void citeste(){
     int i,j;
     f>>n;
     for (i=1;i<=n;++i){
      c[0][i]=c[i][0]=0;
      r[0][i]=1;
      r[i][0]=0;
      a[0].push_back(i);
      for (j=1;j<=n;++j){ 
       f>>c[i][100+j];
       c[100+j][i]=-c[i][100+j];
       r[i][100+j]=1;
       r[100+j][i]=0;
       a[i].push_back(100+j);}
      c[100+i][201]=0;
      c[201][100+i]=0;
      r[100+i][201]=1;
      r[201][100+i]=0;
      a[100+i].push_back(201);
       }
      }
int drum(){
    queue<int> q;
    int t[NMAX],aux,min;
    bool u[NMAX];
    vector<int>::iterator it;
    memset(u,false,sizeof(u));
    memset(dmin,Inf,sizeof(dmin));
    memset(t,0,sizeof(t));
    dmin[0]=0;
    q.push(0);u[0]=true;
    while (!q.empty()){
          aux=q.front();
          q.pop();u[aux]=false;
          for (it=a[aux].begin();it!=a[aux].end();it++)
           if (r[aux][*it]>0)
            if (dmin[*it]>dmin[aux]+c[aux][*it]){
              dmin[*it]=dmin[aux]+c[aux][*it];
              t[*it]=aux;
              if (!u[*it]){
                q.push(*it);
                u[*it]=true;}
              }
          }
    if (!t[201]) return -1;
    aux=201;
    while (aux){
          g<<aux<<' ';
          r[t[aux]][aux]=0;
          r[aux][t[aux]]=1;
          a[aux].push_back(t[aux]);
          aux=t[aux];}
    g<<dmin[201]<<'\n';
    return dmin[201];
}   
void flux(){
     int w,i,j;
     sol=1;
     do{
       w=drum();
       sol+=w;
       }while (w>=0);
     g<<sol;
     }
int main(){
    citeste();
    flux();
    return 0;
}