Cod sursa(job #1052383)

Utilizator hevelebalazshevele balazs hevelebalazs Data 11 decembrie 2013 10:56:58
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#include <string.h>
#include <vector>
#define fr(i,a,b) for(int i=a;i<=b;++i)
#define N 10000
using namespace std;
vector<int>o[N+1];
int l[N+1],r[N+1];
bool c[N+1];
void pr(int i,int j){
    r[j]=i,l[i]=j;
    }
bool p(int i){
    if(c[i])return false;
    c[i]=true;
    int s=o[i].size()-1;
    fr(j,0,s) if(!r[o[i][j]]){
        pr(i,o[i][j]);
        return true;
        }
    fr(j,0,s) if(p(r[o[i][j]])){
        pr(i,o[i][j]);
        return true;
        }
    return false;
    }

int main(){
    freopen("cuplaj.in","r",stdin);
    freopen("cuplaj.out","w",stdout);
    int n,m,e,x,y;
    scanf("%i%i%i",&n,&m,&e);
    fr(i,1,e)scanf("%i%i",&x,&y),o[x].push_back(y);
    bool u=true;
    while(u){
        memset(c,false,sizeof(c));
        u=false;
        fr(i,1,n)if(!l[i])u|=p(i);
        }
    int c=0;
    fr(i,1,n)if(l[i])++c;
    printf("%i\n",c);
    fr(i,1,n)if(l[i])printf("%i %i\n",i,l[i]);
    return 0;
    }