Pagini recente » Cod sursa (job #405541) | Cod sursa (job #2396671) | Cod sursa (job #1143722) | Cod sursa (job #1691041) | Cod sursa (job #995080)
Cod sursa(job #995080)
#include <cstdio>
#include <cstring>
using namespace std;
struct nod {int inf;nod* next;};
typedef nod *lista;
lista lv[10001],p;
int ns,nd,m,x,y,i,st[10001],dr[10001],used[10001];
int dfs(int i)
{
int rez;
lista p;
if(!used[i])
{
used[i]=1;
for(p=lv[i];p;p=p->next)
if(st[p->inf]==0)
{
dr[i]=p->inf;
st[p->inf]=i;
return 1;
}
else
{
rez=dfs(st[p->inf]);
if(rez)
{
dr[i]=p->inf;
st[p->inf]=i;
return 1;
}
}
}
return 0;
}
int main()
{
FILE *f=fopen("cuplaj.in","r");
FILE *g=fopen("cuplaj.out","w");
fscanf(f,"%d%d%d",&ns,&nd,&m);
for(i=1;i<=m;i++)
{
fscanf(f,"%d%d",&x,&y);
p=new nod;p->inf=y;p->next=lv[x];lv[x]=p;
}
int ok=1,direct,nl=0;
while(ok)
{
ok=0;
memset(used,0,sizeof(used));
for(i=1;i<=ns;i++)
if(!dr[i])
{
direct=0;
for(p=lv[i];p;p=p->next)
if(st[p->inf]==0)
{
dr[i]=p->inf;
st[p->inf]=i;
direct=1;ok=1;
used[i]=1;
break;
}
if(!direct)
ok=ok|dfs(i);
}
}
for(i=1;i<=ns;i++)if(dr[i])nl++;
fprintf(g,"%d\n",nl);
for(i=1;i<=ns;i++)
if(dr[i]) fprintf(g,"%d %d\n",i,dr[i]);
return 0;
}