Mai intai trebuie sa te autentifici.
Cod sursa(job #2510125)
Utilizator | Data | 15 decembrie 2019 20:38:52 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.1 kb |
#include <fstream>
#include <vector>
#include <bitset>
#define dim 10001
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int n,m,i,j,e,l[dim],r[dim],sol;
vector <int> v[dim];
bitset <dim> f;
bool cupl(int nod){
if(f[nod])
return 0;
f[nod]=1;
int x;
for(int i=0;i<v[nod].size();i++){
x=v[nod][i];
if(r[x]==0){
r[x]=nod;
l[nod]=x;
sol++;
return 1;
}
}
for(int i=0;i<v[nod].size();i++){
x=v[nod][i];
if(cupl(r[x])){
r[x]=nod;
l[nod]=x;
return 1;
}
}
return 0;
}
int main(){
fin>>n>>m>>e;
for(;e;e--){
fin>>i>>j;
v[i].push_back(j);
}
bool ok;
do{
f.reset();
ok=0;
for(i=1;i<=n;i++)
if(l[i]==0)
if(cupl(i))
ok=1;
}while(ok);
fout<<sol<<"\n";
for(i=1;i<=n;i++)
if(l[i])
fout<<i<<" "<<l[i]<<"\n";
return 0;
}