Cod sursa(job #3337313)

Utilizator DavidAA007Apostol David DavidAA007 Data 27 ianuarie 2026 10:34:08
Problema Cuplaj maxim in graf bipartit Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
const int DIM = 10000, DIMM = 50000;
struct muchie
{
	int nod, pos;
};
muchie t[DIM + 1];
int contor=0;
vector <muchie> v[DIM + 1];
int n, m, dp[DIM + 1];
queue <int> q;
int c[2 * DIMM + 1];
bool bfs ()
{
	for (int i = 0; i <= n+m+1; i++)
		t[i] = {0, 0}, dp[i] = 0;
	q.push (0);
	dp[0] = 1e9;
	while (!q.empty ())
	{
		int nod = q.front ();
		q.pop ();
		for (int i = 0; i < (int) v[nod].size (); i++)
		{
			int vecin = v[nod][i].nod;
			int pos = v[nod][i].pos;
			if (dp[vecin] == 0 && c[pos])
			{
				t[vecin] = {nod, pos};
				q.push (vecin);
				dp[vecin] = min (c[pos], dp[nod]);
			}
		}
	}
	return dp[n+m+1];
}
void add_flux (int flux)
{
	int nod = n+m+1;
	while (nod != 0)
	{
		c[t[nod].pos] -= flux;
		c[t[nod].pos ^ 1] += flux;
		nod = t[nod].nod;
	}
}
int main ()
{
	int x, y, p;
	fin >> n >> m >> p;
	//cout<<n<<" "<<m<<" "<<p;
	for (int i = 0; i < p; i++)
	{
		fin >> x >> y;
		v[x].push_back ({n+y, contor});
		v[n+y].push_back ({x, contor+1});
		c[contor] = 1, c[contor+1] = 0;
		contor+=2;
	}
	for(int i=1;i<=n;i++)
    {
        //conectam s ul
        v[0].push_back({i,contor});
        v[i].push_back({0,contor+1});
        c[contor] = 1, c[contor+1] = 0;
		contor+=2;
    }
    for(int i=1;i<=m;i++)
    {
        //conectam t ul
        v[n+m+1].push_back({n+i,contor});
        v[n+i].push_back({n+m+1,contor+1});
        c[contor] = 0, c[contor+1] = 1;
		contor+=2;
    }
	int sol = 0;
	while (bfs ())
	{
		//cout<<"Intru aici\n";
		int flux = dp[n+m+1];
		add_flux (flux);
		sol += flux;
	}
	fout << sol<<"\n";
	for(int i=1;i<=n;i++)
    {
        for(auto x:v[i])
        {
            if(c[x.pos]==0 && x.nod!=0)
            {
                //am gasit o muchie saturata
                fout<<i<<" "<<x.nod-n<<"\n";
            }
        }
    }
	return 0;
}