Cod sursa(job #1543109)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 5 decembrie 2015 22:34:55
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;
vector<int> g[20010];
int seen[20010],answer=0,right_pair[10010],left_pair[10010];
int match(int node){
    int i,dim=g[node].size();
    seen[node]=1;
    for(i=0;i<dim;i++)
        if(left_pair[g[node][i]]==0){
            answer++;
            left_pair[g[node][i]]=node;
            right_pair[node]=g[node][i];
            return 1;
        }
    for(i=0;i<dim;i++)
        if(seen[left_pair[g[node][i]]]==0)
            if(match(left_pair[g[node][i]])==1){
                left_pair[g[node][i]]=node;
                right_pair[node]=g[node][i];
                return 1;
            }
    return 0;
}
int main(){
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int left,right,ok=1,i,m,a,b;
    scanf("%d%d%d",&left,&right,&m);
    for(i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        g[a].push_back(b);
    }
    while(ok==1){
        ok=0;
        memset(seen,0,sizeof(seen));
        for(i=1;i<=left;i++)
            if(right_pair[i]==0&&match(i)==1)
                ok=1;
    }
    printf("%d\n",answer);
    for(i=1;i<=left;i++)
        if(right_pair[i]!=0)
            printf("%d %d\n",i,right_pair[i]);
    return 0;
}