Pagini recente » Cod sursa (job #579105) | Cod sursa (job #799052) | Cod sursa (job #500245) | Cod sursa (job #1000606) | Cod sursa (job #1451416)
#include <stdio.h>
#include <string.h>
#define MAXN 10000
#define MAXE 100000
int val[MAXE+1], next[MAXE+1], lista[MAXN+1], fata[MAXN+1], bajatu[MAXN+1], viz[MAXN+1], k;
inline void adauga(int x, int y){
val[++k]=y;
next[k]=lista[x];
lista[x]=k;
}
int gasim(int x){
if(viz[x]){
return 0;
}
viz[x]=1;
int p=lista[x];
while(p){
if(bajatu[val[p]]==0){
bajatu[val[p]]=x;
fata[x]=val[p];
return 1;
}
p=next[p];
}
p=lista[x];
while(p){
if(gasim(bajatu[val[p]])){
bajatu[val[p]]=x;
fata[x]=val[p];
return 1;
}
p=next[p];
}
return 0;
}
int main(){
int n, m, e, x, y, f, i, ans;
FILE *fin, *fout;
fin=fopen("cuplaj.in", "r");
fout=fopen("cuplaj.out", "w");
fscanf(fin, "%d%d%d", &n, &m, &e);
for(i=0; i<e; i++){
fscanf(fin, "%d%d", &x, &y);
adauga(x, y);
}
f=1;
while(f){
f=0;
memset(viz, 0, sizeof viz);
for(i=1; i<=n; i++){
if(fata[i]==0){
if(gasim(i)){
f=1;
}
}
}
}
ans=0;
for(i=1; i<=n; i++){
if(fata[i]){
ans++;
}
}
fprintf(fout, "%d\n", ans);
for(i=1; i<=n; i++){
if(fata[i]){
fprintf(fout, "%d %d\n", i, fata[i]);
}
}
fclose(fin);
fclose(fout);
return 0;
}