Cod sursa(job #1625279)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 2 martie 2016 17:56:36
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

ifstream f("cuplaj.in");
ofstream g("cuplaj.out");

long n,i,m,e,ok,viz[20005],u,v,C[20005];
vector<int> G[20005];

void cup(long nod)
{
    for (int i=0;i<G[nod].size();i++)
        if (C[G[nod][i]]==0)
        {
            C[nod]=G[nod][i];
            C[G[nod][i]]=nod;
            return ;
        }
}


void greedy()
{
    for (int i=1;i<=n+m;i++)
    {
        if (C[i]==0)
            cup(i);
    }
}

void cupleaza(long a,long b)
{
    C[a]=b;
    C[b]=a;
}


void decupleaza(long a)
{
    C[a]=0;
}

bool dfs(long nod)
{
    viz[nod]=1;
    for (int i=0;i<G[nod].size();i++)
    {
        if (viz[G[nod][i]]==0)
        {
            if (C[G[nod][i]]!=0)
            {
                viz[G[nod][i]]=1;
                if (dfs(C[G[nod][i]]))
                {
                    decupleaza(C[nod]);
                    cupleaza(nod,G[nod][i]);
                    return 1;
                }
            }
            else
            {
                decupleaza(C[nod]);
                cupleaza(nod,G[nod][i]);
                return 1;
            }
        }
    }
    return 0;
}

int main()
{
    f>>n>>m>>e;
    for (i=1;i<=e;i++)
    {
        f>>u>>v;
        v+=n;
        G[u].push_back(v);
        G[v].push_back(u);
    }

    //greedy();

    for (i=1;i<=n;i++)
    {
        if (C[i]==0)
        {
            memset(viz,0,sizeof(viz));
            dfs(i);
        }
    }
    long nr=0;
    for (i=1;i<=n;i++)
        if(C[i]!=0)
            nr++;
    g<<nr<<'\n';
    for (i=1;i<=n;i++)
        if (C[i]!=0)
            g<<i<<' '<<C[i]-n<<'\n';
    return 0;
}