Cod sursa(job #1708471)

Utilizator DjokValeriu Motroi Djok Data 27 mai 2016 10:10:15
Problema Cc Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include<bits/stdc++.h>
using namespace std;

typedef struct lnod {
    int nod,cost,cap,flow,last;
}nod;

const int INF=1e9+69*69;

int i,j,n,flow,rs,cost,x,id[205],tata[205],q[205],qt,qh,poz[205],d[205];
vector<nod> g[205];

void add(int x,int y,int cost) {
    nod r1={y,cost,1,0,(int)g[y].size()};
    nod r2={x,-cost,0,0,(int)g[x].size()};

    g[x].push_back(r1);
    g[y].push_back(r2);
}

int Update() {
    int addflow=n-flow;

    for(x=2*n+1;x;x=tata[x])
    {
      int p=tata[x],pos=poz[x];
      addflow=min(addflow,g[p][pos].cap-g[p][pos].flow);
    }

    for(x=2*n+1;x;x=tata[x])
    {
      int p=tata[x],pos=poz[x];
      int rev=g[p][pos].last;

      g[p][pos].flow+=addflow;
      g[x][rev].flow-=addflow;
      rs+=g[p][pos].cost;
    }

    return addflow;
}

int main()
{
  ifstream cin("cc.in");
  ofstream cout("cc.out");

  ios_base::sync_with_stdio(0); cin.tie(0);

  cin>>n;
  for(i=1;i<=n;++i)
   for(j=1;j<=n;++j)
   {
     cin>>cost;
     add(i,n+j,cost);
   }

  for(i=1;i<=n;++i)
  {
    add(0,i,0);
    add(n+i,2*n+1,0);
  }

  while(flow<n)
  {
    for(i=0;i<=2*n+2;++i) id[i]=0,d[i]=INF;

    qt=qh=0; q[qt++]=0; d[0]=0;
    while(qt!=qh)
    {
      x=q[qh++]; id[x]=2;
      if(qh==2*n+2) qh=0;

      for(i=0;i<(int)g[x].size();++i)
      {
        nod &r=g[x][i];

        if(r.flow<r.cap && d[r.nod]>d[x]+r.cost)
        {
          d[r.nod]=d[x]+r.cost;

          if(!id[r.nod])
          {
            q[qt++]=r.nod;
            if(qt==2*n+2) qt=0;
          }
          else if(id[r.nod]==2)
               {
                 if(--qh==-1) qh=2*n+1;
                 q[qh]=r.nod;
               }

          id[r.nod]=1; tata[r.nod]=x; poz[r.nod]=i;
        }
      }
    }

    if(d[2*n+1]==INF) break;

    flow+=Update();
  }

  cout<<rs<<'\n';

 return 0;
}