Cod sursa(job #3270388)

Utilizator Shaan_StefanShaan Stefan Shaan_Stefan Data 23 ianuarie 2025 09:59:40
Problema Cuplaj maxim in graf bipartit Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <vector>

#define NMAX 10000

using namespace std;
FILE *in=fopen("cuplaj.in", "r"), *out=fopen("cuplaj.out", "w");

int n, m, p, x, y, nm, mx;
vector<int> adc[NMAX+2];
vector<bool> us;
vector<int> mt;
vector<int> l;
bool kuhn(int v)
{
    if(us[v]==1)
        return  0;
    
    us[v]=1;

    for(auto it : adc[v])
    {
        if(mt[it]==-1 || kuhn(mt[it]))
        {
            mt[it]=v;
			l[v]=it;
            return 1;
        }
    }
    return 0;
}

int main()
{
    fscanf(in, "%d %d %d", &n, &m, &p);
    for(int i=1; i<=p; i++)
    {
        fscanf(in, "%d %d", &x, &y);
        y += n;
        adc[x].push_back(y);
    }

	bool change = 1;
	mt.assign(n+m+1, -1);
	l.assign(n+m+1, -1);
	while(change)
	{
		change = 0;
		us.assign(n+m+1, 0);
		for(int i=1; i<=n; i++)
		{
			if(l[i] == -1)
				change |= kuhn(i);
		}
	}	

	int cp = 0;
	for(int i=1; i<=n; i++) cp += (l[i] > 0);

	fprintf(out, "%d\n", cp);
	for(int i=1; i<=n; i++)
		if(l[i] > 0)
			fprintf(out, "%d %d\n", i, l[i]); 
}