Pagini recente » Cod sursa (job #1617653) | Cod sursa (job #1711005) | Cod sursa (job #1656489) | Cod sursa (job #2104939) | Cod sursa (job #563414)
Cod sursa(job #563414)
#include<cstdio>
#include<cstdlib>
#include<vector>
using namespace std;
#define MAX 2000000000
vector<vector<int> > G;
int n,m,e;
vector<int> l,d,q,r,u;
bool BFS()
{
q.clear();
for(int i=1;i<=n;i++)
if(l[i] == 0)
{
d[i] = 0;
q.push_back(i);
}
else
d[i] = MAX;
d[0] = MAX;
while (q.size())
{
int v = q.front();
q.erase(q.begin());
if(v)
for(int i=0;i<G[v].size();i++)
if(d[r[G[v][i]]] == MAX)
{
d[r[G[v][i]]] = d[v] + 1;
q.push_back(r[G[v][i]]);
}
}
return d[0] != MAX;
}
bool DFS(int v)
{
if(v && !u[v])
{
u[v] = 1;
for(int i=0;i<G[v].size();i++)
if(d[r[G[v][i]]] == d[v] + 1)
if(!r[i] || DFS(r[G[v][i]]))
{
r[G[v][i]] = v;
l[v] = G[v][i];
return true;
}
d[v] = MAX;
return false;
}
return true;
}
int HK()
{
int match = 0;
do
{
u.clear();
u.resize(n+5,0);
for(int i = 1;i<=n;i++)
if(l[i] == 0)
if(DFS(i) == true)
match ++;
}while(BFS());
return match;
}
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&n,&m,&e);
G.resize(n+5);
l.resize(n+5,0);
d.resize(n+5,0);
r.resize(m+5,0);
int f,t;
for(int i=0;i<e;++i)
{
scanf("%d %d",&f,&t);
G[f].push_back(t);
}
int k = HK();
printf("%d\n",k);
for(int i=1;i<=n;i++)
if(l[i])
printf("%d %d\n",i,l[i]);
}