Pagini recente » Cod sursa (job #2303848) | Cod sursa (job #2470888) | Cod sursa (job #282694) | Cod sursa (job #669545) | Cod sursa (job #373347)
Cod sursa(job #373347)
using namespace std;
#include <cstdio>
#define MAX 10005
struct nod{
int info;
nod * next;
};
nod * G[MAX];
int n,m, //nr de varfuri per multime
L[MAX], //L[k]=x <=> muchia (k,x) face parte din cuplaj
R[MAX], //R[k] = x <=> muchia (x,k) face parte din cuplaj
u[MAX], //vector caracteristic, pentru cuplarea curenta
cuplaj; //valoarea cuplajului (nr de muchii)
void read(){
freopen("cuplaj.in","r",stdin);
int i,j,nrm;
nod *p;
scanf("%d%d%d", &n,&m,&nrm);
for(i=1 ; i<=n;i++)
G[i]=NULL;
for( ; nrm ; --nrm){
scanf("%d%d",&i,&j);
p=new nod;
p->info=j;
p->next=G[i];
G[i]=p;
}
}
void write(){
freopen("cuplaj.out","w",stdout);
printf("%d\n",cuplaj);
for(int i=1;i<=n;i++)
if(L[i])
printf("%d %d\n",i,L[i]);
}
int pereche(int x){
//cuplez x din stanga cu ceva din dreapta
if(u[x])
return 0;
u[x]=1;
for(nod *p=G[x] ; p ; p=p->next){
int i=p->info;
if(R[i]==0 || pereche(R[i])){
L[x]=i, R[i]=x;
return 1;
}
}
return 0;
}
void cupleaza(){
int gata=0;
cuplaj=0;
while(!gata){
gata=1;
for(int i=1;i<=n;i++)
u[i]=0;
for(int i=1;i<=n;i++)
if(L[i]==0)
if(pereche(i))
cuplaj++, gata=0;
}
}
int main(){
read();
cupleaza();
write();
}