Cod sursa(job #2698427)

Utilizator FrostfireMagirescu Tudor Frostfire Data 22 ianuarie 2021 09:24:40
Problema Cuplaj maxim in graf bipartit Scor 14
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 20000
#define f first
#define s second

using namespace std;

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

int n1, n2, m, viz[NMAX+10], ans;
vector <pair <pair <int, int> , int> > nod[NMAX+10];
pair <int, int> p[NMAX+10];
queue <int> Q;

int addFlow()
{	for(int i=0; i<=n1+n2+1; i++)
		p[i] = {0, 0}, viz[i] = 0;
	while(!Q.empty())
		Q.pop();
	viz[0] = 1;
	Q.push(0);
	while(!Q.empty())
		{	int a = Q.front();
			Q.pop();
			for(int i=0; i<nod[a].size(); i++)
				if(nod[a][i].f.s && !viz[nod[a][i].f.f])
					{	p[nod[a][i].f.f] = {a, i};
						viz[nod[a][i].f.f] = 1;
						if(nod[a][i].f.f == n1 + n2 + 1) return 1;
						Q.push(nod[a][i].f.f);
					}
		}
	return 0;
}

int main()
{
	fin >> n1 >> n2 >> m;
	for(int i=1; i<=m; i++)
		{	int nod1, nod2;
			fin >> nod1 >> nod2;
			nod2 += n1;
			nod[nod1].push_back({{nod2, 1}, nod[nod2].size()});
			nod[nod2].push_back({{nod1, 1}, nod[nod1].size()-1});
		}
	for(int i=1; i<=n1; i++)
		{	nod[0].push_back({{i, 1}, nod[i].size()});
			nod[i].push_back({{0, 0}, nod[0].size()-1});
		}
	for(int i=n1+1; i<=n1+n2; i++)
		{	nod[i].push_back({{n1+n2+1, 1}, nod[n1+n2+1].size()});
			nod[n1+n2+1].push_back({{i, 0}, nod[i].size()-1});
		}
	while(addFlow())
		{	ans++;
			int curr = n1 + n2 + 1;
			while(curr)
				{	int pr = p[curr].f, p1 = p[curr].s, p2 = nod[pr][p1].s;
					nod[pr][p1].f.s--;
					nod[curr][p2].f.s++;
					curr = pr;
				}
		}
	fout << ans << '\n';
	for(int i=1; i<=n1; i++)
		{	for(int j=0; j<nod[i].size()-1; j++)
				if(!nod[i][j].f.s)
					fout << i << ' ' << nod[i][j].f.f - n1 << '\n';
		}
	return 0;
}