Pagini recente » Cod sursa (job #777057) | Istoria paginii runda/simulare-cartita-32/clasament | Cod sursa (job #2601441) | Cod sursa (job #1946539) | Cod sursa (job #1439520)
#include<fstream>
#include<cstring>
using namespace std;
typedef struct celula {
int nod;
celula *next;
}*lista;
lista graf[10005],v;
int i,n,m,e,l[10005],r[10005];
bool viz[10005];
bool cupleaza(int nod) {
if (viz[nod]) return 0;
viz[nod]=1;
for (lista p=graf[nod]; p; p=p->next)
if (r[p->nod]==0) {
r[p->nod]=nod;
l[nod]=p->nod;
return 1;
}
for (lista p=graf[nod]; p; p=p->next)
if (cupleaza(r[p->nod])) {
r[p->nod]=nod;
l[nod]=p->nod;
return 1;
}
return 0;
}
int main(void) {
ifstream cin("cuplaj.in");
ofstream cout("cuplaj.out");
bool ok=1;
cin>>n>>m>>e;
for (i=1; i<=e; ++i) {
int x, y;
cin>>x>>y;
v=new celula; v->nod=x; v->next=graf[y]; graf[y]=v;
}
while (ok) {
ok=0;
memset(viz,0,sizeof(viz));
for (i=1; i<=n; ++i)
if (l[i]==0&&cupleaza(i)) ok=1;
}
int cmax=0;
for (i=1; i<=n; ++i) if (l[i]) ++cmax;
cout<<cmax<<"\n";
for (i=1; i<=n; ++i) if (l[i]) cout<<i<<" "<<l[i]<<"\n";
return 0;
}