Cod sursa(job #1118087)

Utilizator a96tudorAvram Tudor a96tudor Data 23 februarie 2014 23:35:47
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
#include<vector>
#include<cstring>
#define pb push_back
#define N_MAX 10010
using namespace std;
vector <int> G[N_MAX];
bool used[N_MAX];
int M1[N_MAX],M2[N_MAX],N;
inline void Write_Sol(int N)
{
    int NR=0;
    for (int i=1;i<=N;++i) if (M1[i]) NR++;
    printf("%d\n",NR);
    for (int i=1;i<=N;++i) if (M1[i]) printf("%d %d\n",i,M1[i]);
}
inline int Find_Match(int nod)
{
    if (used[nod]) return 0;
    used[nod]=true;
    for (vector <int> :: iterator it=G[nod].begin();it!=G[nod].end();++it)
        if (!M2[*it]) {M1[nod]=*it; M2[*it]=nod; return 1;}
    for (vector <int> :: iterator it=G[nod].begin();it!=G[nod].end();++it)
        if (Find_Match(M2[*it])) {M1[nod]=*it; M2[*it]=nod; return 1;}
    return 0;
}
inline void Solve(int OK,int N)
{
    if (!OK) return;
    int ok=0;
    memset(used,false,sizeof(used));
    for (int i=1;i<=N;++i)
        if (!M1[i]) ok+=Find_Match(i);
    Solve(ok,N);
}
inline void Load_Data(int &N)
{
    int M,E,x,y;
    scanf("%d%d%d",&N,&M,&E);
    for (int i=1;i<=E;++i)
        scanf("%d%d",&x,&y), G[x].pb(y);
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    Load_Data(N);
    Solve(1,N);
    Write_Sol(N);
    fclose(stdin); fclose(stdout);
    return 0;
}