Cod sursa(job #928719)

Utilizator batistaUPB-Oprea-Cosmin-Dumitru batista Data 26 martie 2013 17:27:07
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define N 10003
using namespace std;
int rez,dr[N],st[N],x,y,i,na,nb,m;
int ok,viz[N];
struct nod{int info;nod*adr;}*v[N],*p;
int dfs(int nd)
{
    if(viz[nd]) return 0;
    viz[nd]=1;
    nod *p=v[nd];
    while(p)
    {
        if(!st[p->info])
        {
            st[p->info]=nd;
            dr[nd]=p->info;
            rez++;
            return 1;
        }
        p=p->adr;
    }
    p=v[nd];
    while(p)
    {
        if(dfs(st[p->info]))
        {
            dr[nd]=p->info;
            st[p->info]=nd;
            return 1;
        }
        p=p->adr;
    }
    return 0;
}

int main()
{
    freopen("cuplaj.in","r",stdin);freopen("cuplaj.out","w",stdout);
    scanf("%d %d %d",&na,&nb,&m);
    for(i=1;i<=m;i++)
    {
      scanf("%d %d",&x,&y);
      p=new nod;
      p->info=y; p->adr=v[x]; v[x]=p;
    }
    ok=1;
    while(ok)
    {
        ok=0;
        memset(viz,false,sizeof(viz));
        for(i=1;i<=na;i++)
         if(!dr[i])
          if(dfs(i)) ok=1;
    }
    printf("%d\n",rez);
    for (i=1;i<=na;i++)
        if (dr[i]) printf("%d %d\n",i,dr[i]);
    return 0;
}