Cod sursa(job #2889307)

Utilizator lolismekAlex Jerpelea lolismek Data 12 aprilie 2022 16:34:25
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.9 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>

using namespace std;

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

const int N = 1000, inf = 1e9;
vector <int> adj[N + 1];
int cap[N + 1][N + 1], flux[N + 1][N + 1], parent[N + 1], n, m, e;

bitset <N + 1> viz;

bool bfs(int sursa, int destinatie){
	for(int i = 1; i <= n; i++)
		parent[i] = 0;
	viz.reset();

	queue <int> q;

	q.push(1);
	viz[sursa] = 1;

	while(!q.empty()){
		int nod = q.front();
		q.pop();

		if(nod == destinatie)
			return true;

		for(auto vec : adj[nod]){
			if(!viz[vec] && cap[nod][vec] - flux[nod][vec] > 0){
				parent[vec] = nod;
				viz[vec] = 1;
				q.push(vec);
			}
		}
	}

	return false;
}

int main(){
	fin >> n >> m >> e;

	for(int i = 1; i <= e; i++){
        int a, b;
        fin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
        cap[a][b] = 1;
	}

    int max_flow = 0, sursa = 0, destinatie = n + m + 1;

    for(int i = 1; i <= n; i++){
        adj[sursa].push_back(i);
        adj[i].push_back(sursa);
        cap[sursa][i] = 1;
    }

    for(int i = n + 1; i <= n + m; i++){
        adj[i].push_back(destinatie);
        adj[destinatie].push_back(i);
        cap[i][destinatie] = 1;
    }

	while(bfs(sursa, destinatie)){
		for(auto vec : adj[destinatie]){
			if(cap[vec][destinatie] - flux[vec][destinatie] <= 0 || !viz[vec])
				continue;

			parent[destinatie] = vec;

			int mini = inf, nod = destinatie;

			while(nod != 1){
				mini = min(mini, cap[parent[nod]][nod] - flux[parent[nod]][nod]);
				nod = parent[nod];
			}

			if(mini == 0)
				continue;

			nod = destinatie;
			while(nod != 1){
				flux[parent[nod]][nod] += mini;
				flux[nod][parent[nod]] -= mini;
				nod = parent[nod];
			}

			max_flow += mini;

		}
	}

	fout << max_flow;

	return 0;
}