Cod sursa(job #674617)

Utilizator mihai995mihai995 mihai995 Data 6 februarie 2012 16:10:17
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

const int N=10005;
int S[N],D[N];
bool use[N];
vector<int> a[N];

ifstream in("java.in");
ofstream out("java.out");

bool pairup(int x)
{
    if (use[x])
        return false;
    use[x]=true;
    for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if (!D[*i])
        {
            S[x]=*i;
            D[*i]=x;
            return true;
        }
    for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
        if (pairup(D[*i]))
        {
            S[x]=*i;
            D[*i]=x;
            return true;
        }
    return false;
}

void cuplaj()
{
    int m,x,y,nr=0;
    bool change=true;
    in>>S[0]>>D[0]>>m;
    for (int i=1;i<N;i++)
    {
        a[i].clear();
        S[i]=D[i]=0;
    }
    while (m--)
    {
        in>>x>>y;
        a[x].push_back(y);
    }
    while (change)
    {
        memset(use,false,sizeof(use));
        change=false;
        for (int i=1;i<=S[0];i++)
            if (!S[i])
                change|=pairup(i);
    }
    for (int i=1;i<=S[0];i++)
        if (S[i])
            nr++;
    out<<nr<<"\n";
}

int main()
{
    int t;
    in>>t;
    while (t--)
        cuplaj();
    return 0;
}