Pagini recente » Cod sursa (job #328167) | Cod sursa (job #2879346) | Cod sursa (job #3188483) | Cod sursa (job #917760) | Cod sursa (job #1226610)
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
typedef struct lista
{
int info;
lista *next;
} * nod;
nod a[10001];
int i,j,k,m,n,u,l;
bool viz[10001];
int este[10001],h[10001],sol;
void add(int x, nod &p)
{
nod r = new lista;
r->info=x;
r->next=p;
p=r;
}
bool dfs(int x)
{
if (viz[x]==1) return 0;
viz[x]=1;
nod r=a[x];
while (r)
{
if (!este[r->info] || dfs(este[r->info]))
{
este[r->info]=x;
h[x]=r->info;
//++sol;
return 1;
}
r=r->next;
}
return 0;
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d%d%d",&n,&k,&m);
for (i=1; i<=m; ++i)
{
int x,y;
scanf("%d%d",&x,&y);
add(y,a[x]);
}
bool ok = true;
int sol=0;
while (ok)
{
ok=false;
memset(viz,0,sizeof(viz));
for (i=1; i<=n; ++i)
if (!h[i]) ok+=dfs(i);// sol++;
}
for (i=1; i<=k; ++i)
if (este[i]) ++sol;
printf("%d\n",sol);
for (i=1; i<=k; ++i)
if ( este[i] ) printf("%d %d\n",i,este[i]);
return 0;
}