Pagini recente » Cod sursa (job #2579090) | Cod sursa (job #2118872) | Cod sursa (job #2120152) | Cod sursa (job #566623) | Cod sursa (job #2207383)
#include <bits/stdc++.h>
using namespace std;
bool se_poate(vector<vector<int> >&lista_adiacenta,vector<vector<int> >&flux,vector<vector<int> >&capacitate){
queue<int>coada;
vector<bool>folosit(flux.size(),false);
vector<int>tati(flux.size(),-1);
folosit[0]=true;
coada.push(0);
tati[0]=0;
while(!coada.empty()){
int aux=coada.front();
coada.pop();
for(unsigned int i=0;i<lista_adiacenta[aux].size();i++){
int aux2=lista_adiacenta[aux][i];
if(!folosit[aux2]&&flux[aux][aux2]<capacitate[aux][aux2]){
folosit[aux2]=true;
tati[aux2]=aux;
coada.push(aux2);
}
}
}
if(tati[tati.size()-1]==-1)return false;
int aux=folosit.size()-1;
while(tati[aux]!=aux){
flux[tati[aux]][aux]++;
flux[aux][tati[aux]]--;
aux=tati[aux];
}
return true;
}
int main()
{
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int nr_bip1;
int nr_bip2;
in>>nr_bip1>>nr_bip2;
int nr_noduri=nr_bip1+nr_bip2;
vector<vector<int > > capacitate(nr_noduri+2,vector<int>(nr_noduri+2,0));
vector<vector<int> >flux(capacitate);
vector<vector<int> >lista_adiacenta(nr_noduri+2,vector<int>(0));
for(int i=1;i<=nr_bip1;i++){
lista_adiacenta[0].push_back(i);
capacitate[0][i]=1;
}
for(int i=nr_bip1+1;i<=nr_noduri;i++){
lista_adiacenta[i].push_back(nr_noduri+1);
capacitate[i][nr_noduri+1]=1;
}
int nr_arce;
in>>nr_arce;
for(int i=1;i<=nr_arce;i++){
int aux1,aux2;
in>>aux1>>aux2;
lista_adiacenta[aux1].push_back(nr_bip1+aux2);
lista_adiacenta[nr_bip1+aux2].push_back((aux1));
capacitate[aux1][nr_bip1+aux2]=1;
}
while(se_poate(lista_adiacenta,flux,capacitate)){}
int sum=0;
for(unsigned int i=0;i<=lista_adiacenta[0].size();i++)sum+=flux[0][lista_adiacenta[0][i]];
out<<sum<<'\n';
for(int i=1;i<=nr_bip1;i++){
for(int j=nr_bip1+1;j<=nr_noduri;j++){
if(flux[i][j])out<<i<<" "<<j-nr_bip1<<'\n';
}
}
in.close();out.close();
return 0;
}