Cod sursa(job #2958546)

Utilizator Tudose_StefanTudose Alexandru Stefan Tudose_Stefan Data 26 decembrie 2022 21:51:41
Problema Cuplaj maxim in graf bipartit Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.4 kb
#include <bits/stdc++.h>

using namespace std;

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

unordered_map <int, int> cty;
int tata[20002];
vector <vector<int>> adjL;
vector  <int> viz;
int n1, n2, m, i, nr1, nr2, nr3, flow, minn, j;

int BFS(){
	queue<int> q;
	q.push(0);
	viz.assign(n1+n2+2, 0);
	while(!q.empty()){
		nr1 = q.front();
		q.pop();
		if(nr1 == n1+n2+1)
			break;
		viz[nr1]=1;
		for(auto &i : adjL[nr1]){
			if (!viz[i] && cty[nr1 + i * 20001] != 0){
				viz[i] = 1;
                if (cty[nr1 + i * 20001] == -1)
                    tata[i] = -nr1;
                else
                    tata[i] = nr1;
				q.push(i);
			}
		}
	}
	return viz[n1+n2+1];
}


int main(){
  	fin >> n1 >> n2 >> m;
  	adjL.assign(n1+n2+2, vector<int>());

  	for(i = 0; i < m; ++i){
  		fin >> nr1 >> nr2;
  		adjL[nr1].push_back(nr2+n1);
  		adjL[nr2+n1].push_back(nr1);
  		cty[nr1 + (nr2+n1) * 20001] = 1;
  	}

  	for (i = 1; i <= n1; ++i){
        adjL[0].push_back(i);
        adjL[i].push_back(0);
        cty[0 + i * 20001]= 1;
  	}
  	for (i = n1+1; i <= n1+ n2 ; ++i){
        adjL[i].push_back(n1+n2+1);
        adjL[n1+n2+1].push_back(i);
        cty[i+ (n1+n2+1)*20001] = 1;
  	}

  	vector<pair <int, int>> rez;

  	while(BFS()){
  		for(auto &i:adjL[n1+n2+1]){
            minn = 1;
  			tata[n1+n2+1] = i;
  			for (j = n1+n2+1; j> 0;){
                if (tata[j] < 0){
                    minn = min(minn, -cty[-tata[j] + j * 20001]);
                    j = -tata[j];
                }
  				else{
                    minn = min(minn, cty[tata[j] + j * 20001]);
                    j = tata[j];
  				}
  			}
  			for (j = n1+n2+1; j> 0;){
                if (tata[j] < 0){
                    cty[-tata[j] + j * 20001] += minn;
                    cty[j + (-tata[j]) * 20001] += minn;
                    j = -1 * tata[j];
                }
  				else{
                    cty[tata[j] + j * 20001] -= minn;
                    cty[j + tata[j] * 20001] -= minn;
                    j = tata[j];
  				}
  			}
  		}
  	}
  	for(i=1; i<= n1; ++i){
        for(auto &k : adjL[i]){
            if (cty[i+ k * 20001] == 0 && k != 0){
                rez.push_back({i, k-n1});
            }
        }
  	}
  	fout << rez.size() << "\n";
  	for( auto & k : rez)
        fout << k.first << " " << k.second << '\n';

	return 0;
}