Pagini recente » Cod sursa (job #2457463) | Cod sursa (job #1755886) | Cod sursa (job #442777) | Cod sursa (job #1729341) | Cod sursa (job #2230713)
#include <fstream>
#include <vector>
std::ifstream cin("cuplaj.in");
std::ofstream cout("cuplaj.out");
#define maxn 10005
#define FORI(i,g) for(std::vector <int>::iterator i=(g).begin();i!=(g).end();i++)
int N,M,E;
std::vector <int>G[maxn];
int L[maxn],R[maxn],viz[maxn];
int HopcroftKarp(const int x){
if(viz[x]) return 0;//ca sa nu fie loop infinit, viz se reseteaza dupa o schimbare in main
viz[x]=1;
FORI(i,G[x])
if(!R[*i]){
R[*i]=x;
L[x]=*i;
return 1;
}
FORI(i,G[x])
if(HopcroftKarp(R[*i])){ //HopcroftKarp(R[*i]) e defapt o val de pe L(stenga)
R[*i]=x; //si va cauta o alta val pt acesta,
L[x]=*i; //iar R[*i] se va elibera pt x ul nostru
return 1;
}
return 0;
}
int main()
{
int x,y,counter=0;
cin>>N>>M>>E;
for(;E--;){
cin>>x>>y;
G[x].push_back(y);
}
for(int change=1;change;){
change=0;
for(int i=1;i<=N;i++)
viz[i]=0;
for(int i=1;i<=N;i++)
if(!L[i])
change |= HopcroftKarp(i);
}
for(int i=1;i<=N;i++)
counter += (L[i]>0);
cout<<counter<<'\n';
for(int i=1;i<=N;i++)
if(L[i]>0)
cout<<i<<' '<<L[i]<<'\n';
}