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