Cod sursa(job #1469614)

Utilizator adina0822Ciubotaru Adina-Maria adina0822 Data 8 august 2015 22:27:12
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
using namespace std;
#include <fstream>
#define min(x,y) ((x)<(y)?(x):(y))
#define abs(x) ((x)>0?x:-x)

FILE *f=fopen ("date.in", "r");
FILE *g=fopen ("date.out", "w");

int n1,n2,m,s,d,n;
int viz[20010];
int Q[20010];
int C[20010][20010];
int F[20010][20010];

void read();
void solve();
void write();
int bfs();




int main ()
{

  read();
  solve();
  write();



  return 0;
}

void read()
{
    int x,y,i;
    fscanf(f,"%d%d%d",&n1,&n2,&m);
    n=n1+n2+2;
    s=n-1;
    d=n;
    for(i=1; i<=n1; i++) C[s][i]=1;
    for(i=1; i<=n2; i++) C[i+n1][d]=1;
    for(i=1; i<=m; i++)
    {
        fscanf(f,"%d%d",&x,&y);
        C[x][y+n1]=1;
    }

}

void solve()
{
    int i,a,b,v,lg;
    int L[20010];
    do
    {
        for(i=1; i<=n; i++) viz[i]=0;
        if(bfs()) return;
        L[0]=d;
        lg=0;
        a=b=100;
        while(L[lg]!=s)
        {
            ++lg;
            L[lg]=abs(viz[L[lg-1]]);
            if(viz[L[lg-1]]>0)
            a=min(a,C[L[lg]][L[lg-1]]-F[L[lg]][L[lg-1]]);
            else if (viz[L[lg-1]]<0)
            b=min(b,F[L[lg-1]][L[lg]]);
        }
        v=min(a,b);
        for(i=lg; i>0; i--)
          if(viz[L[i-1]]>0)
            F[L[i]][L[i-1]]+=v;
          else
             F[L[i-1]][L[i]]-=v;
    } while(1);
}

void write ()
{
    int i,j,nr=0;
    for(i=1; i<=n1; i++)
      for(j=n1+1; j<=n1+n2; j++)
        if(F[i][j]) nr++;
    for(i=1; i<=n1; i++)
      for(j=n1+1; j<=n1+n2; j++)
        if(F[i][j]) fprintf(g,"%d %d\n",i,j-n1);
}

int bfs()
{
    int p,u,i,x;
    Q[0]=s;
    p=u=0;
    viz[s]=1;
    while(p<=u && !viz[d])
    {
        x=Q[p++];
        for(i=1; i<=n; i++)
           if(!viz[i])
              if(F[x][i]<C[x][i])
               {
                   viz[i]=x;
                   Q[++u]=i;
               }
               else if (F[i][x]>0)
               {
                   viz[i]=-x;
                   Q[++u]=i;
               }

    }

     return !viz[d];
}