Pagini recente » Cod sursa (job #368744) | Cod sursa (job #1910372) | Cod sursa (job #409377) | Cod sursa (job #1048726) | Cod sursa (job #2960862)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
//Complexitatea algotirmului este O(N^2 * M)
int n,m;
bool BFS(vector<vector<int>>& graf, vector<vector<int>>& capacitati, vector<int>& nivel){
for(int i = 1; i <= n+m+1; i++)
nivel[i] = -1;
nivel[0] = 0;
queue<int> q;
q.push(0);
while(!q.empty()){
int nod = q.front();
q.pop();
for(int i = 0; i < graf[nod].size(); i++){
int nod_aux = graf[nod][i];
if (capacitati[nod][nod_aux] > 0 && nivel[nod_aux] < 0){
nivel[nod_aux] = nivel[nod] + 1;
q.push(nod_aux);
}
}
}
//daca nu ajung la destinatie returnez false
if(nivel[n+m+1] < 0) return false;
else return true;
};
int trimite_flux(vector<vector<int>>& graf, vector<vector<int>>& capacitati, vector<int>& nivel, vector<int>& count, int nod , int flow){
if(nod == n+m+1)
return flow;
if(count[nod] == graf[nod].size())
return 0;
for(auto nod2 : graf[nod]){
if(capacitati[nod][nod2] > 0){
count[nod]++;
if(nivel[nod2] == nivel[nod]+1){
int flow_aux = min(flow,capacitati[nod][nod2]);
int capac_minima = trimite_flux(graf,capacitati,nivel,count,nod2,flow_aux);
if(capac_minima > 0){
if(capacitati[nod2][nod] == 0)
graf[nod2].push_back(nod);
capacitati[nod][nod2] -= capac_minima;
capacitati[nod2][nod] += capac_minima;
return capac_minima;
}
}
}
}
return 0;
}
int main() {
int e;
fin>>n>>m>>e;
vector<vector<int>> graf, capacitati; //lista de adiacenta, respectiv matrice cu capacitati
graf.resize(n+m+2);
capacitati.resize(n+m+2, vector<int> (n+m+2, 0));
for(int i = 1; i <= n; i++) {
capacitati[0][i] = 1;
graf[0].push_back(i);
}
for(int i = n+1; i <= n+m; i++) {
capacitati[i][n + m + 1] = 1;
graf[i].push_back(n+m+1);
}
//citesc datele
for(int i = 0; i < e; i++){
int sursa,destinatie;
fin>>sursa>>destinatie;
capacitati[sursa][n+destinatie] = 1;
graf[sursa].push_back(n+destinatie);
}
//rezolvare (folosesc algoritmul Edmonds–Karp)
int flow_max = 0;
vector<int> nivel(n+m+2,-1);
while(BFS(graf, capacitati, nivel)){
vector<int> count(n+m+2, 0);
int aux = trimite_flux(graf,capacitati,nivel,count,0,10000);
while(aux){
flow_max += aux;
aux = trimite_flux(graf,capacitati,nivel,count,0,10000);
}
}
fout<<flow_max<<'\n';
for(int i = 1; i <= n; i++){
int j;
for( j = 0; j < graf[i].size(); j++){
if(capacitati[i][graf[i][j]] == 0 && graf[i][j] > n) {
fout << i << " " << graf[i][j] - n;
break;
}
}
cout<<j<<" ";
if(j != graf[i].size()) fout<<'\n';
}
}