Pagini recente » Cod sursa (job #2267296) | Cod sursa (job #1081317) | Cod sursa (job #2851712) | Cod sursa (job #1791211) | Cod sursa (job #1131724)
#include<fstream>
#include<algorithm>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
struct nod{int inf;nod* leg;};
typedef nod* PNod;
PNod L[100001];
void add(int a,int b)
{
PNod p=new nod;
p->inf=b;
p->leg=L[a];L[a]=p;
}
int viz[10001],marc1[10001],marc2[10002],nr,E,n,m;
int potrivire(int i)
{
PNod p;
if(viz[i])return 0;
viz[i]=1;
for(p=L[i];p;p=p->leg)
{
if(!marc2[p->inf])
{
marc1[i]=p->inf;
marc2[p->inf]=i;
return 1;
}
}
for(p=L[i];p;p=p->leg)
{
if(potrivire(marc2[p->inf]))
{
marc1[i]=p->inf;
marc2[p->inf]=i;
return 1;
}
}
return 0;
}
int main()
{
int a,b,i;
f>>n>>m>>E;
for(i=1;i<=E;i++)
{
f>>a>>b;
add(a,b);
}
int terminat=1;
while(terminat)
{
terminat=0;
memset(viz,0,sizeof(viz));
for(i=1;i<=n;i++)
if(!marc1[i])terminat+=potrivire(i);
}
nr=0;
for(i=1;i<=n;i++)
if(marc1[i])nr++;
g<<nr<<'\n';
for(i=1;i<=n;i++)
if(marc1[i])g<<i<<" "<<marc1[i]<<"\n";
return 0;
}