Cod sursa(job #302483)

Utilizator perticas_catalinperticas catalin perticas_catalin Data 8 aprilie 2009 22:19:41
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.01 kb
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
FILE*fin=fopen("cc.in","r");
FILE*fout=fopen("cc.out","w");
#define nm 305
#define inf 1000000000
#define pb push_back
#define min(a,b)((a)<(b)?(a):(b))
int cost[nm][nm],flow[nm][nm],cap[nm][nm],d,ans=0,inside[nm];
int dmin[nm],t[nm],n;
vector<int> g[nm];
queue<int> q;
int drum()
{
  int i,nod,nnod,fl_crt;  
  for(i=0;i<=d;i++)
  {
    inside[i]=0;
    dmin[i]=inf;
  }  
  q.push(0);
  inside[0]=1;
  dmin[0]=0;
  while(!q.empty())
  {
    nod=q.front();
    q.pop();
    inside[nod]=0;
    for(i=0;i<g[nod].size();i++)
    {
      nnod=g[nod][i];
      if(cap[nod][nnod]-flow[nod][nnod])
      if(dmin[nnod]>dmin[nod]+cost[nod][nnod])
      {
        dmin[nnod]=dmin[nod]+cost[nod][nnod];
        t[nnod]=nod;
        if(!inside[nnod])
        {
          q.push(nnod);
          inside[nnod]=1;
        }
      }
    }
  }  
  if(dmin[d]==inf) return 0;
  fl_crt=inf;
  nod=d;
  while(nod)
  {
    fl_crt=min(fl_crt,cap[t[nod]][nod]-flow[t[nod]][nod]);        
    nod=t[nod];
  }
  ans+=fl_crt*dmin[d];
  nod=d;
  while(nod)
  {
    flow[t[nod]][nod]+=fl_crt;
    flow[nod][t[nod]]-=fl_crt;        
    nod=t[nod];
  }
  return 1;
}
int main()
{
  int i,j,c;  
  memset(cap,0,sizeof(cap));
  memset(flow,0,sizeof(flow));
  fscanf(fin,"%d",&n);  
  //multimea A->multimea B
  for(i=1;i<=n;i++)
    for(j=1;j<=n;j++)
    {
      fscanf(fin,"%d",&c);
      g[i].pb(j+n);
      g[j+n].pb(i);
      cap[i][j+n]=1;
      cost[i][j+n]=c;
      cost[j+n][i]=-c;
    }
  //sursa->multimea A  
  for(i=1;i<=n;i++)
  {
    g[0].pb(i);
    g[i].pb(0);
    cap[0][i]=1;
    cost[i][0]=cost[0][i]=0;
  }  
  //multimea B->destinatie
  d=2*n+1;  
  for(i=1;i<=n;i++)
  {
    g[d].pb(i+n);
    g[i+n].pb(d);
    cap[i+n][d]=1;
    cost[i+n][d]=cost[d][i+n]=0;
  }
  while(drum());
  fprintf(fout,"%d",ans);  
  fclose(fin);
  fclose(fout);
  return 0;
}