Pagini recente » Cod sursa (job #127063) | Cod sursa (job #559435) | Cod sursa (job #2128548) | Cod sursa (job #3169614) | Cod sursa (job #2608636)
#include <fstream>
#include <vector>
using namespace std;
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
int N,M, viz[101000],L[10100], R[10100];
vector <int> l[20100];
inline void scan() {
int u,v,E;
cin>>N>>M>>E;
for(int i=1; i<=E; ++i)
{
cin>>u>>v;
l[u].push_back(v);
}
}
inline bool cup(int x)
{
viz[x]=1;
//ori cupleaza cu vecin/dr
for(int i=0; i<l[x].size(); ++i)
if(!R[l[x][i]]) {
L[x]=l[x][i];
R[l[x][i]]=x;
return 1;
}
//ori daca toti sunt ocupati
//cupleaza cu cel care poate fi
//decuplat daca stii cum zic
for(int i=0; i<l[x].size(); ++i)
if(!viz[R[l[x][i]]] && cup(R[l[x][i]])) {
L[x]=l[x][i];
R[l[x][i]]=x;
return 1;
}
return 0;
}
int main()
{
bool ok;
scan();
do{
ok=0;
for(int i=1; i<=N; ++i)
if(!viz[i] && !L[i])
ok=max(ok,cup(i));
for(int i=1; i<=N; viz[i++]=0);//nu inteleg ce are lumea cu memset
}while(ok);
int lg=0;
for(int i=1; i<=N; lg+=(L[i++]!=0));
cout<<lg<<'\n';
for(int i=1; i<=N; ++i)
if(L[i])
cout<<i<<' '<<L[i]<<'\n';
return 0;
}