Pagini recente » Cod sursa (job #2808577) | Cod sursa (job #485658) | Cod sursa (job #42034) | Cod sursa (job #1187903) | Cod sursa (job #1871100)
#include <cstdio>
#include <vector>
using namespace std;
vector <int> v[10004],v1[10004],s;
int n,m,e,i,x,y,nr1,nr[10004],a[10004],b[10004],k,j,h,h1,q,u[10004];
bool ok;
void cupleaza (int x)
{
int z,h,i;
z=v[x].size();
for (k=0;k<=(z-1);k++)
{
q=b[v[x][k]];
if (nr[q]>0 && u[q]==0)
{
for (j=0;j<=(v[q].size()-1);j++)
{
if (a[v[q][j]]==0)
break;
}
if (a[v[q][j]]==0)
{
a[v[q][j]]=1;
b[v[q][j]]=q;
b[q]=x;
for (h=0;h<=(v1[v[q][j]].size()-1);h++)
nr[v1[v[q][j]][h]]--;
}
ok=true;
nr1++;
return;
}
else if (u[q]==0)
{
u[q]=1;
cupleaza (b[q]);
if (ok==true)
b[v[x][k]]=x;
return;
}
}
}
int main()
{
freopen ("cuplaj.in","r",stdin);
freopen ("cuplaj.out","w",stdout);
scanf ("%d %d %d", &n, &m, &e);
for (i=1;i<=e;i++)
{
scanf ("%d %d", &x, &y);
v[x].push_back(y);
v1[y].push_back(x);
nr[x]++;
}
nr1=0;
for (i=1;i<=n;i++)
{
ok=false;
k=v[i].size();
for (j=0;j<=(k-1);j++)
{
if (a[v[i][j]]==0)
{
a[v[i][j]]=1;
b[v[i][j]]=i;
ok=true;
nr1++;
for (h=0;h<=(v1[v[i][j]].size()-1);h++)
nr[v1[v[i][j]][h]]--;
break;
}
}
if (ok==false)
s.push_back(i);
}
h=s.size();
ok=true;
while (ok==true && k>=1)
{
ok=false;
for (i=0;i<=(h-1);i++)
{
u[s[i]]=1;
cupleaza(s[i]);
if (ok==true)
{
s.erase(s.begin()+i);
break;
}
for (j=1;j<=n;j++)
u[s[i]]=0;
}
h=s.size();
}
printf ("%d\n", nr1);
for (i=1;i<=m;i++)
{
if (b[i]!=0)
printf ("%d %d\n", b[i], i);
}
return 0;
}