Cod sursa(job #1231854)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 21 septembrie 2014 17:27:50
Problema Cuplaj maxim in graf bipartit Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include<fstream>
#include<vector>
using namespace std;
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
const int NOD = 10009;

vector<int> v[NOD];
int n,m,e;
int viz[NOD],l[NOD],r[NOD];

void init()
{

    for(int i = 0 ; i <= NOD ; i++)
        viz[i] = 0;
}

bool cupleaza(int start)
{

    if(viz[start])
        return false;
    viz[start] = 1;
    int i;
    for(i = 0; i <= v[start].size()-1 ; i++){
        if(!r[v[start][i]]){
            l[start] = v[start][i];
            r[v[start][i]] = start;
            return true;
        }
    }
    for(i = 0 ; i <= v[start].size()-1 ; i++){
        if(cupleaza(r[v[start][i]])){
            l[start] = v[start][i];
            r[v[start][i]] = start;
            return true;
        }
    }
    return false;
}

int main()
{

    in>>n>>m>>e;
    int i,x,y;
    for(i= 1 ; i <= e ; i++){
        in>>x>>y;
        v[x].push_back(y);
    }
    bool ok = true;
    while(ok){
        ok = false;
        init();
        for(i = 1 ; i <= n ; i++)
            if(!l[i])
             ok = ok || cupleaza(i);
    }
    int contor = 0;
    for(i = 1 ; i <= n ; i++)
        if(l[i])
            contor++;
    out<<contor<<"\n";
    for(i = 1 ; i <= n ; i++)
        if(l[i]){
            out<<i<<" "<<l[i]<<"\n";
        }
    return 0;
}