Pagini recente » Cod sursa (job #304712) | Cod sursa (job #562846) | Cod sursa (job #2787576) | Cod sursa (job #2522591) | Cod sursa (job #2487674)
#include <fstream>
#include <vector>
#include <deque>
#include <bitset>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n, m, i, nod, crt, tata, minim,sol, t[20002], tatf[20002], e, vecin, ult, x, y, nodmare, nodmic;
char flux[20002][20002], c[20002][20002];
bitset<20002> f;
deque<int> coada;
vector<int> v[20002];
int bfs(){
f.reset();
f[0] = 1;
int ok = 0;
t[0] = -1;
coada.push_back(0);
while(!coada.empty()){
int nod = coada[0];
for(int i = 0;i<v[nod].size();i++){
int vecin = v[nod][i];
if(f[vecin] == 0 && c[nod][vecin] > flux[nod][vecin]){
coada.push_back(vecin);
f[vecin] = 1;
t[vecin] = nod;
if(vecin == ult)
ok = 1;
}
}
coada.pop_front();
}
return ok;
}
int main(){
fin>>n>>m>>e;
ult = 2*n+1;
for(i=1;i<=e;i++){
fin>>x>>y;
y += n;
if(f[y] == 0)
v[ult].push_back(y);
f[y] = 1;
v[0].push_back(x);
c[0][x] = 1;
v[x].push_back(0);
v[x].push_back(y);
c[x][y] = 1;
v[y].push_back(x);
v[y].push_back(ult);
c[y][ult] = 1;
}
while(bfs()){
for(i=0;i<v[ult].size();i++){
int crt = v[ult][i];
if(f[nod] == 1){
nod = crt;
tata = t[nod];
minim = c[nod][ult] - flux[nod][ult];
while(tata != -1){
minim = min(minim, c[tata][nod] - flux[tata][nod]);
nod = tata;
tata = t[nod];
}
nod = ult;
tata = crt;
while(tata != -1){
flux[tata][nod] += minim;
flux[nod][tata] -= minim;
nodmare = max(nod, tata);
nodmic = min(nod, tata);
if(flux[nodmic][nodmare] == 1)
tatf[nodmare] = nodmic;
nod = tata;
tata = t[nod];
}
sol += minim;
}
}
}
fout<<sol<<"\n";
for(i=0;i<v[ult].size();i++){
crt = v[ult][i];
if(flux[crt][ult] == 1)
fout<<tatf[crt]<<" "<<crt-n<<"\n";
}
return 0;
}