Pagini recente » Cod sursa (job #1114324) | Cod sursa (job #116770) | Cod sursa (job #254447) | Cod sursa (job #510957) | Cod sursa (job #1486320)
#include <cstdio>
#include <vector>
#include <cstring>
#define nmax 100005
#define pmax 10005
using namespace std;
int N,M,e,sol;
int st[pmax],dr[pmax];
bool viz[pmax];
vector<int>G[nmax];
inline bool Cupleaza(int nod){
if(viz[nod]) return false;
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();it++)
if(!dr[*it]){
dr[*it] = nod;
st[nod] = *it;
return true;
}
viz[nod] = 1;
for(vector<int>::iterator it = G[nod].begin();it!=G[nod].end();it++)
if(Cupleaza(dr[*it])){
dr[*it] = nod;
st[nod] = *it;
return true;
}
return false;
}
inline void solve(){
int i,gata = 1;
while(gata){
gata = 0;
memset(viz,0,sizeof(viz));
for(i = 1; i <= N; ++i)
if(!st[i] && Cupleaza(i)){
gata = 1;
++sol;
}
}
}
int main(){
int i,x,y;
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d\n",&N,&M,&e);
for(i = 1; i <= e; ++i){
scanf("%d %d\n",&x,&y);
G[x].push_back(y);
}
solve();
printf("%d\n",sol);
for(i = 1; i <= N; ++i)
if(st[i])
printf("%d %d\n",i,st[i]);
return 0;
}