Cod sursa(job #1604394)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 18 februarie 2016 11:10:38
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.16 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#define NMAX 10023
#define EMAX 200023
#define DIM 10000
using namespace std;
char buff[DIM];
int poz=0;
void citeste(int &numar)
{
     numar = 0;
     while (buff[poz] < '0' || buff[poz] > '9')
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM)
               fread(buff,1,DIM,stdin),poz=0;
     }
}
int t,n,m,e;
vector<int>adj[NMAX];
int l[NMAX],r[NMAX];
bool u[NMAX];
struct str
{
    int x;
    int y;
}vec[EMAX];
int comp(str a,str b)
{
    if(a.x!=b.x) return a.x<b.x;
    return a.y<b.y;
}
int cuplaj(int nod)
{
    if(u[nod]) return 0;
    u[nod]=1;
    int mar=adj[nod].size();
    for(int i=0;i<mar;i++)
    {
        if(r[adj[nod][i]]==0)
        {
            r[adj[nod][i]]=nod;
            l[nod]=adj[nod][i];
            return 1;
        }
    }
    for(int i=0;i<mar;i++)
    {
        if(cuplaj(r[adj[nod][i]]))
        {
            r[adj[nod][i]]=nod;
            l[nod]=adj[nod][i];
            return 1;
        }
    }
    return 0;
}
int main()
{
    freopen ("java.in","r",stdin);
    freopen ("java.out","w",stdout);
    citeste(t);
    for(int xyz=1;xyz<=t;xyz++)
    {
        citeste(n),citeste(m),citeste(e);
        for(int i=1;i<=e;i++) citeste(vec[i].x),citeste(vec[i].y);
        sort(vec+1,vec+e+1,comp);
        for(int i=1;i<=e;i++)
        {
            if(vec[i].x!=vec[i-1].x||vec[i].y!=vec[i-1].y) adj[vec[i].x].push_back(vec[i].y);
            vec[i].x=0;
            vec[i].y=0;
        }
        for(int c=1;c!=0;)
        {
            c=0;
            for(int i=1;i<=n;i++)
            {
                if(l[i]==0) c|=cuplaj(i);
            }
            for(int i=1;i<=n;i++) u[i]=0;
        }
        int sum=0;
        for(int i=1;i<=n;i++)
        {
            if(l[i]!=0) sum++;
            l[i]=0;
            u[i]=0;
            while(!adj[i].empty()) adj[i].pop_back();
        }
        for(int i=1;i<=m;i++) r[i]=0;
        printf("%d\n",sum);
    }
}