Mai intai trebuie sa te autentifici.
Cod sursa(job #2482444)
Utilizator | Data | 28 octombrie 2019 11:57:32 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 80 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva educationala | Marime | 1.15 kb |
//#include <iostream>
#include <fstream>
#include <vector>
#include<cstring>
using namespace std;
vector<int> v[10005];
int f[10005],dre[10005];
bool func(int i){
int ok=0;
f[i]=1;
for(auto it:v[i]){
if(dre[it]==0){
dre[it]=i;
return true;
}
}
for(auto it:v[i]){
if(f[dre[it]]==0)
if(func(dre[it])){
dre[it]=i;
return true;
}
}
return false;
}
int main()
{
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
int n,m,e,st,dr,sum=0;
cin>>n>>m>>e;
for(int i=1;i<=e;i++){
cin>>st>>dr;
v[st].push_back(dr);
}
for(int i=1;i<=n;i++){
//cout<<i<<"\n";
memset(f,0,sizeof(f));
sum+=func(i);
}
cout<<sum<<"\n";
for(int i=1;i<=m;i++){
if(dre[i]!=0){
cout<<dre[i]<<" "<<i<<"\n";
}
}
return 0;
}
/*
int solve(int nod)
{
if(viz[nod])
return 0;
viz[nod]=1;
for(auto i:v[nod])
if(!cup[1][i]||solve(cup[1][i]))
{
cup[0][nod]=i;
cup[1][i]=nod;
return 1;
}
return 0;
}
*/