Cod sursa(job #1023592)

Utilizator dariusdariusMarian Darius dariusdarius Data 7 noiembrie 2013 13:03:56
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> G[10005];
int st[10005];
int dr[10005];
bool viz[10005];
int pair_up(int u)
{
    if(viz[u]) return 0;
    viz[u]=true;
    for(vector<int>::iterator it=G[u].begin();it!=G[u].end();it++)
        if(!dr[*it])
        {
            st[u]=*it;
            dr[*it]=u;
            return 1;
        }
    for(vector<int>::iterator it=G[u].begin();it!=G[u].end();it++)
        if(dr[*it] && pair_up(dr[*it]))
        {
            st[u]=*it;
            dr[*it]=u;
            return 1;
        }
    return 0;
}
int main()
{
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int cuplaj=0,N,M,K;bool flag;
    scanf("%d%d%d",&N,&M,&K);
    for(int x,y,i=1;i<=K;i++)
    {
        scanf("%d%d",&x,&y);
        G[x].push_back(y);
    }
    do
    {
        flag=true;
        memset(viz,false,sizeof viz);
        for(int i=1;i<=N;i++)
            if(!st[i] && pair_up(i))
            {
                flag=false;
                cuplaj++;
            }
    }while(!flag);
    printf("%d\n",cuplaj);
    for(int i=1;i<=N;i++)
        if(st[i])
            printf("%d %d\n",i,st[i]);
    return 0;
}