Pagini recente » Cod sursa (job #1847315) | Cod sursa (job #61422) | Cod sursa (job #2547450) | Cod sursa (job #3144133) | Cod sursa (job #645462)
Cod sursa(job #645462)
#include <fstream>
#include <cstring>
#define gSize 10001
#define useSize 10001
#define LSize 10001
#define RSize 10001
using namespace std;
ifstream in;
ofstream out;
struct graf
{
int nod;
graf *link;
}*g[gSize];
bool use[useSize];
int L[LSize];
int R[RSize];
inline void addedge(int x,int y)
{
graf *p;
p=new graf;
p->nod=y;
p->link=g[x];
g[x]=p;
}
inline int match(int nod)
{
if(use[nod]) return 0;
use[nod]=true;
for(graf *p=g[nod];p;p=p->link)
if(!R[p->nod])
{
L[nod]=p->nod;
R[p->nod]=nod;
return 1;
}
for(graf *p=g[nod];p;p=p->link)
if(match(R[p->nod]))
{
L[nod]=p->nod;
R[p->nod]=nod;
return 1;
}
return 0;
}
int main()
{
int n,N,M,sol,x,y;
in.open("cuplaj.in");
in>>n>>N>>M;
for(;M--;)
{
in>>x>>y;
addedge(x,y);
}
in.close();
memset(L,0,sizeof(L));
memset(R,0,sizeof(R));
sol=0;
for(bool ok=true;ok;)
{
ok=false;
memset(use,false,sizeof(use));
for(int i=1;i<=n;++i)
if(!L[i])
if(match(i)) ++sol,ok=true;
}
out.open("cuplaj.out");
out<<sol<<'\n';
if(n<N)
{
for(int i=1;i<=n;++i)
if(L[i]) out<<i<<' '<<L[i]<<'\n';
}
else
for(int i=1;i<=N;++i)
if(R[i]) out<<R[i]<<' '<<i<<'\n';
out.close();
return 0;
}