Pagini recente » Cod sursa (job #866257) | Cod sursa (job #770603) | Monitorul de evaluare | Cod sursa (job #1197729) | Cod sursa (job #851190)
Cod sursa(job #851190)
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
#define NMAX 20005
struct nod {
int y,cap;
nod *urm,*inv;
};
typedef nod* PNOD;
PNOD v[NMAX],p[NMAX];
int viz[NMAX],c[NMAX],ant[NMAX],n,nr,ok;
PNOD creare(int y, int cap)
{
PNOD aux;
aux=new nod;
aux->urm=0;
aux->inv=0;
aux->y=y;
aux->cap=cap;
return aux;
}
void adauga(int x, int y)
{
PNOD a,b;
a=creare(y,1);
b=creare(x,0);
a->inv=b;
b->inv=a;
a->urm=v[x];
b->urm=v[y];
v[x]=a;
v[y]=b;
}
int dfs(int nod)
{
viz[nod]=nr;
for(PNOD aux=v[nod];aux!=NULL;aux=aux->urm)
if(viz[aux->y]!=nr && aux->cap>=1) {
p[aux->y]=aux;
ant[aux->y]=nod;
if(aux->y==n) {
nod=n;
for(PNOD it=p[n];it!=NULL;nod=ant[nod],it=p[nod]) {
it->cap--;
it->inv->cap++;
}
return 1;
}
if(dfs(aux->y))
return 1;
}
return 0;
}
int main ()
{
int n1,n2,m,i,x,y,cuplaj;
PNOD aux;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
f>>n1>>n2>>m;
for(i=0;i<=n1+n2+1;i++)
v[i]=0;
for(i=1;i<=m;i++) {
f>>x>>y;
adauga(x,y+n1);
}
f.close();
for(i=1;i<=n1;i++)
adauga(0,i);
for(i=1;i<=n2;i++)
adauga(i+n1,n1+n2+1);
for(cuplaj=0,n=n1+n2+1,nr=1;dfs(0);cuplaj++,nr++);
g<<cuplaj<<'\n';
for(i=1;i<=n1;i++)
for(aux=v[i];aux!=NULL;aux=aux->urm)
if(aux->cap==0 && aux->y)
g<<i<<" "<<aux->y-n1<<'\n';
g.close();
return 0;
}