Pagini recente » Cod sursa (job #2887653) | Cod sursa (job #2941777) | Cod sursa (job #1167254) | Cod sursa (job #1609609) | Cod sursa (job #2962362)
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int n, m, e, N,i,j,u,v,mini,d,ncur,fluxm,nvec,k;
int viz[20001];
pair<int, int>tata[20001];
vector<vector<pair<pair<int, int>, int>>> l(20001);
int bfs(){
queue<int> que;
que.push(0);
for( i = 0; i <= N; i++){
tata[i] = {-1, -1};
viz[i] = 0;
}
viz[0]++;
while(que.size()!=0){
ncur = que.front();
if(ncur == N)
return 1;
k = 0;
for( i = 0; i < l[ncur].size(); i++){
nvec = l[ncur][i].first.first;
if(l[ncur][i].first.second > 0 && viz[nvec] == 0){
viz[nvec]++;
tata[nvec] = {ncur, k};
que.push(nvec);
}
k++;
}
que.pop();
}
return 0;
}
int Edmonds_Karp(){
fluxm = 0;
while(bfs()){
for(i = 0; i < l[N].size(); i++){
ncur = l[N][i].first.first;
if(l[ncur][l[N][i].second].first.second > 0 && viz[ncur]){
mini = 9999999;
tata[N] = {ncur, l[N][i].second};
d = N;
while(tata[d].first!=-1){
mini = min(mini, l[tata[d].first][tata[d].second].first.second);
d = tata[d].first;
}
fluxm += mini;
d = N;
while(tata[d].first!=-1){
l[tata[d].first][tata[d].second].first.second -= mini;
l[d][l[tata[d].first][tata[d].second].second].first.second += mini;
d = tata[d].first;}}}}
return fluxm;
}
int main()
{
f>>n>>m>>e;
N=n+m+1;
for(i=0;i<e;i++){
f>>u>>v;
l[u].push_back({{v+n ,1}, l[v+n].size()});
l[v+n].push_back({{u, 0}, l[u].size()-1});
}
for( i = 1; i <= n; i++){
l[0].push_back({{i, 1}, l[i].size()});
l[i].push_back({{0, 0}, l[0].size()-1});
}
for( i = 1; i <= m; i++){
l[i+n].push_back({{N, 1}, l[N].size()});
l[N].push_back({{i+n, 0}, l[i+n].size()-1});
}
g<<Edmonds_Karp()<<"\n";
for( i = 1; i <= n; i++)
for( j = 0; j <l[i].size(); j++){
if(l[i][j].first.second != 1 && l[i][j].first.first != 0)
g<<i<<" "<<l[i][j].first.first - n<<"\n";
}
}