Cod sursa(job #750415)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 22 mai 2012 03:18:45
Problema Cuplaj maxim in graf bipartit Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.17 kb
#include<iostream>
#include<fstream>
#include<vector>

using namespace std;

const int Nmax = 10001;

ifstream in("cuplaj.in");
ofstream out("cuplaj.out");

vector<int> v[Nmax];
int n,m,e,nr_muchii,dreapta[Nmax],stanga[Nmax];
bool viz[Nmax];

bool cuplez(int nod)
{
	int i,y;
    if ( viz[nod] == 1)
		return 0;
    viz[nod] = 1;
    for( i = 0 ; i < v[nod].size() ; i++ )
    {
		y = v[nod][i];
        if (!stanga[y] || cuplez(stanga[y]))        //nu are vecin sau are vecin dar il pot cupla cu altul
        {   
			dreapta[nod] = y;
			stanga[y] = nod;
            return 1;
        }
    }
    return 0;
}

int main()
{	
	int i,x,y;
	bool cupleaza;
    in>>n>>m>>e;
    for(i = 1 ; i <= e ; i++)
    {   in>>x>>y;
        v[x].push_back(y);
    }
    cupleaza = 1;
    while( cupleaza == 1 )
    {   
		cupleaza = 0;
        for( i = 1 ; i <= n ; i++)
			viz[i]=0;
        for( i = 1 ; i <=n ; i++)
            if (dreapta[i] == 0 && cuplez(i) == 1)
            {   
				cupleaza = 1;
			    nr_muchii++;
	        }
    }
    out<<nr_muchii<<endl;
    for( i = 1 ; i <= n ; i++ )
		if ( dreapta[i] != 0)
			out<<i<<' '<<dreapta[i]<<'\n';
    in.close();
	out.close();
	return 0;
}