Pagini recente » Cod sursa (job #1029295) | Cod sursa (job #773913) | Cod sursa (job #1510316) | Cod sursa (job #2705712) | Cod sursa (job #2961598)
#include<fstream>
#include<vector>
#include<queue>
#include<climits>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n, m, x, y, z, s, t, l, r;
int capacitate[5001][5001];
vector<vector<int>> graf;
int tata[5001];
bool bfs(){
queue<int> q;
int vizitat[n+1];
for(int i=1 ; i<=n; i++)
vizitat[i] = 0;
q.push(s);
vizitat[s] = 1;
tata[s] = -1;
while(!q.empty()){
int u = q.front();
q.pop();
for(auto v: graf[u]){
if(vizitat[v] == 0 && capacitate[u][v] != 0){
tata[v] = u;
if(v == t)
return true;
vizitat[v] = 1;
q.push(v);
}
}
}
return false;
}
int flux_maxim(){
int fluxmax = 0;
while (bfs()){
int u, v = t, flux = INT_MAX;
while(v!=s){
u = tata[v];
if(capacitate[u][v] < flux)
flux = capacitate[u][v];
v = tata[v];
}
v = t;
while(v != s){
u = tata[v];
capacitate[u][v] -= flux;
capacitate[v][u] += flux;
v = tata[v];
}
fluxmax += flux;
}
return fluxmax;
}
int main() {
fin>>l>>r>>m;
n = l+r+2;
s = 0;
t = n-1;
graf.resize(n);
for(int i=1; i<=m; i++){
fin>>x>>y;
graf[x].push_back(y+l);
graf[y+l].push_back(x);
capacitate[x][y+l] = 1;
}
for(int i=1; i<=l; i++){
graf[s].push_back(i);
graf[i].push_back(s);
capacitate[s][i] = 1;
}
for(int i= l+1; i<= n-1; i++){
graf[i].push_back(t);
graf[t].push_back(i);
capacitate[i][t] = 1;
}
fout<<flux_maxim()<<"\n";
for(int i=1; i <= l; i++){
for(auto v: graf[i]){
if(capacitate[i][v] == 0 && v != s && v != t)
fout<<i<<" "<<v-l<<"\n";
}
}
}