Pagini recente » Cod sursa (job #2023938) | Clasament simv_2 | Istoria paginii runda/selectie_emag_mediu_2016_runda3 | Cod sursa (job #746514) | Cod sursa (job #332989)
Cod sursa(job #332989)
#include<stdio.h>
#define NMAX 10003
struct lista {
int x;
lista *next;
};
lista *v[NMAX];
int n,m,e,nc=0,l[NMAX],r[NMAX],u[NMAX];
void add(lista* &l,int x) {
lista *q=new lista;
q->x=x;
q->next=l;
l=q;
}
void citeste() {
int a,b,i;
freopen("cuplaj.in","r",stdin);
scanf("%d %d %d",&n,&m,&e);
for(i=1;i<=n;i++) v[i]=NULL;
for(i=0;i<e;i++) {
scanf("%d %d",&a,&b);
add(v[a],b);
}
}
int pairup(int n) {
lista *q;
if(u[n]) return 0;
u[n]=1;
for(q=v[n];q;q=q->next)
if(!r[q->x]) {
l[n]=q->x;
r[q->x]=n;
return 1;
}
for(q=v[n];q;q=q->next)
if(pairup(r[q->x])) {
l[n]=q->x;
r[q->x]=n;
return 1;
}
return 0;
}
void scrie() {
freopen("cuplaj.out","w",stdout);
printf("%d\n",nc);
for(int i=1;i<=n;i++)
if(l[i]) printf("%d %d\n",i,l[i]);
}
int main() {
int i;
citeste();
for(int change=1;change;) {
change=0;
for(i=1;i<=n;i++) u[i]=0;
for(i=1;i<=n;i++)
if(!l[i])
if(pairup(i)) change=1;
}
for(i=1;i<=n;i++)
if(l[i]>0) nc++;
scrie();
return 0;
}