Pagini recente » Cod sursa (job #1181493) | Cod sursa (job #1420026) | Cod sursa (job #2114851) | Cod sursa (job #2373162) | Cod sursa (job #417093)
Cod sursa(job #417093)
#include<cstdio>
#include<cstring>
#include<vector>
using namespace std;
const int N = 1<<14;
int c,n,m,st[N],dr[N];
vector<int> stanga[N],dreapta[N];
bool marcat[N];
void citire()
{
int e,x,y;
scanf("%d%d%d",&n,&m,&e);
while(e--)
{
scanf("%d%d",&x,&y);
dreapta[x].push_back(y);
stanga[y].push_back(x);
}
}
bool cupleaza(int x)
{
int y;
if(marcat[x])
return false;
marcat[x] = true;
for(size_t i=0 ; i<dreapta[x].size() ; ++i)
{
y = dreapta[x][i];
if(!st[y] || cupleaza(st[y]))
{
dr[x] = y;
st[y] = x;
return true;
}
}
return false;
}
void cuplaj()
{
int i;
for(i=1 ; i<=n ; ++i)
{
if(!dr[i])
cupleaza(i);
if(!dr[i])
{
memset(marcat,0,sizeof(marcat));
cupleaza(i);
}
if(dr[i])
++c;
}
}
void scrie()
{
printf("%d\n",c);
for(int i=1 ; i<=n ; ++i)
if(dr[i])
printf("%d %d\n",i,dr[i]);
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
citire();
cuplaj();
scrie();
return 0;
}