Cod sursa(job #995080)

Utilizator doruliqueDoru MODRISAN dorulique Data 7 septembrie 2013 12:36:46
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <cstring>
using namespace std;

struct nod {int inf;nod* next;};
typedef nod *lista;
lista lv[10001],p;
int ns,nd,m,x,y,i,st[10001],dr[10001],used[10001];

int dfs(int i)
{
    int rez;
    lista p;
    if(!used[i])
    {
        used[i]=1;
        for(p=lv[i];p;p=p->next)
            if(st[p->inf]==0)
                {
                    dr[i]=p->inf;
                    st[p->inf]=i;
                    return 1;
                }
            else
                {
                    rez=dfs(st[p->inf]);
                    if(rez)
                    {
                        dr[i]=p->inf;
                        st[p->inf]=i;
                        return 1;
                    }
                }
    }
    return 0;
}

int main()
{
    FILE *f=fopen("cuplaj.in","r");
    FILE *g=fopen("cuplaj.out","w");
    fscanf(f,"%d%d%d",&ns,&nd,&m);
    for(i=1;i<=m;i++)
    {
        fscanf(f,"%d%d",&x,&y);
        p=new nod;p->inf=y;p->next=lv[x];lv[x]=p;
    }
    int ok=1,direct,nl=0;
    while(ok)
    {
        ok=0;
        memset(used,0,sizeof(used));
        for(i=1;i<=ns;i++)
            if(!dr[i])
            {
                direct=0;
                for(p=lv[i];p;p=p->next)
                    if(st[p->inf]==0)
                        {
                            dr[i]=p->inf;
                            st[p->inf]=i;
                            direct=1;ok=1;
                            used[i]=1;
                            break;
                        }
                if(!direct)
                        ok=ok|dfs(i);
            }
    }
    for(i=1;i<=ns;i++)if(dr[i])nl++;
    fprintf(g,"%d\n",nl);
    for(i=1;i<=ns;i++)
        if(dr[i]) fprintf(g,"%d %d\n",i,dr[i]);
    return 0;
}