Pagini recente » Cod sursa (job #2861159) | Cod sursa (job #577613) | Cod sursa (job #1362754) | Borderou de evaluare (job #3178889) | Cod sursa (job #2962162)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
queue<pair<int, int>> bfs;
vector<vector<int>> parent(2);
vector<vector<vector<int>>> lista(2);
vector<vector<vector<int>>> cap(2);
int main(){
int n, m, e, x, y;
fin>>n>>m>>e;
lista[0].resize(m+1);
lista[1].resize(n+1);
cap[0].resize(m+1, vector<int>(n+1));
cap[1].resize(n+1, vector<int>(m+1));
for(int i=1; i<=e; i++){
fin>>x>>y;
lista[1][x].push_back(y);
lista[0][y].push_back(x);
cap[1][x][y] = 1;
}
for(int i=1; i<=n; i++){
lista[0][0].push_back(i);
lista[1][i].push_back(0);
cap[0][0][i] = 1;
}
for(int i=1; i<=m; i++){
lista[0][i].push_back(0);
lista[1][0].push_back(i);
cap[0][i][0] = 1;
}
parent[0].resize(m+1, -2);
parent[1].resize(n+1, -2);
int p, F=0, set;
while(true){
bfs.push({0, 0});
parent[0][0] = -1;
while(!bfs.empty()){
x = bfs.front().first;
set = bfs.front().second;
bfs.pop();
for(int y: lista[set][x])
if(parent[!set][y] == -2 && cap[set][x][y]) {
parent[!set][y] = x;
if(set && !y) break;
bfs.push({y, !set});
}
if(parent[1][0] != -2) break;
}
p = parent[1][0];
if(p != -2) {
F++;
set = 1;
x = 0;
while (p != -1){
cap[!set][p][x] -= 1;
cap[set][x][p] += 1;
x = p;
set = !set;
p = parent[set][x];
}
fill(parent[0].begin(), parent[0].end(), -2);
fill(parent[1].begin(), parent[1].end(), -2);
while(!bfs.empty()) bfs.pop();
}
else break;
}
fout<<F<<endl;
for(int i=1; i<=n; i++)
for(auto j: lista[1][i])
if(!cap[1][i][j] && j){
fout<<i<<" "<<j<<endl;
break;
}
}