Cod sursa(job #927019)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 25 martie 2013 15:35:20
Problema Cuplaj maxim in graf bipartit Scor 32
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<fstream>
#define N 10002
#define inf 32000
using namespace std;
int na,nb,m,i,x,y,n,cap[N][N],flux[N][N],t[N],Q[N],rez,sol[2][N];
struct nod{int info;nod*adr;}*v[N],*q,*p;
int bfs(int s,int d)
{int i,nd,p=1,u=1;
    for(i=1;i<=n;i++) t[i]=0;
    Q[1]=s;
    while(p<=u)
    {
        nd=Q[p++];
        q=v[nd];
        while(q)
        {
         if(!t[q->info] && cap[nd][q->info]>flux[nd][q->info])
         {
            Q[++u]=q->info;
            t[q->info]=nd;
         }
         q=q->adr;
        }
    }
    return t[d];
}
void ek(int s,int d)
{int i;
    while(bfs(s,d))
    {
      for(i=d;i!=s;i=t[i])
       flux[t[i]][i]++,
       flux[i][t[i]]--;
       rez++;
       sol[0][rez]=t[t[d]]-1;
       sol[1][rez]=t[d]-na-1;
    }
}
void init()
{int i;
    n=na+nb+2;
    for(i=2;i<=na+1;i++)
    {
      cap[1][i]=1;
      p=new nod;
      p->info=1; p->adr=v[i]; v[i]=p;
      p=new nod;
      p->info=i; p->adr=v[1]; v[1]=p;
    }
    for(i=na+2;i<n;i++)
    {
      cap[i][n]=1;
      p=new nod;
      p->info=i; p->adr=v[n]; v[n]=p;
      p=new nod;
      p->info=n; p->adr=v[i]; v[i]=p;
    }

}
int main()
{
    ifstream f("cuplaj.in");ofstream g("cuplaj.out");
    f>>na>>nb>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        x++; y = 1+na+y;
        cap[x][y]=1;
        p=new nod;
        p->info=y; p->adr=v[x]; v[x]=p;
        p=new nod;
        p->info=x; p->adr=v[y]; v[y]=p;
    }
    init();
    ek(1,n);
    g<<rez<<"\n";
    for(i=1;i<=rez;i++)
     g<<sol[0][i]<<" "<<sol[1][i]<<"\n";
    f.close();g.close();
    return 0;
}