Cod sursa(job #1549400)

Utilizator Pintilie_AndreiFII-Pintilie Andrei Pintilie_Andrei Data 12 decembrie 2015 12:05:02
Problema Cuplaj maxim in graf bipartit Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include <iostream>
#include <cstdio>
#include <vector>
#define N 10005
using namespace std;
vector <int> a[N];
int na,nb,m;
int v[N],c[N];
void R()
{
    freopen("cuplaj.in","r",stdin);
    scanf("%d %d %d",&na,&nb,&m);
    int i,x,y;
    for(i=0; i<m; ++i)
    {
        scanf("%d %d",&x,&y);
        y+=na;
        a[x].push_back(y);
        a[y].push_back(x);
    }
}
void Greedy()
{
    int i;
    for(i=1; i<=na+nb; i++)
        c[i]=-1;
    for(i=1; i<=na; ++i)
        if(a[i].size()>0)
    {
        int j;
         for( j=0; j<a[i].size() && c[a[i][j]]>-1; ++j) ;
         if(j<a[i].size())
         {
            c[a[i][j]]=i;
            c[i]=a[i][j];
         }


    }
}
int dfs(int i)
{
    v[i]=1;
    //cout<<"DSADAS";
    for(int j=0; j<a[i].size(); ++j)
    {

        int k=a[i][j];
        if(v[k] || c[i]==k) continue ;
        if(c[k]==-1)
        {

            c[k]=i;
            v[k]=1;
            c[i]=k;
            return 1;
        }
        v[k]=1;
         if(dfs(c[k]))
        {
            c[k]=i;
            c[i]=k;
            return 1;
        }
    }
    return 0;
}
void Afiseaza()
{
    freopen("cuplaj.out","w",stdout);
    int i,sol=0;
     for(i=1; i<=na; ++i)
        if(c[i]>0) sol++;
     printf("%d\n",sol);
    for(i=1; i<=na; ++i)
        if(c[i]>0)
        printf("%d %d\n",i,c[i]-na);
    printf("\n");
}
int main()
{
    int ok=1,i;
    R();
    Greedy();
//        for(i=1; i<=na+nb; i++)
//        c[i]=-1;
    while(ok)
    {
        //Afiseaza();
        ok=0;
        for(i=1; i<=na+nb; i++) v[i]=0;
        for(i=1; i<=na; ++i)
            if(!v[i] && c[i]==-1)
                if(dfs(i)) ok=1;

    }
    Afiseaza();
    return 0;
}