Pagini recente » Cod sursa (job #371698) | Cod sursa (job #892499) | Cod sursa (job #827015) | Cod sursa (job #268413) | Cod sursa (job #953099)
Cod sursa(job #953099)
#include <iostream>
#include <queue>
#include <fstream>
#include <vector>
#define lmax 15000
#define infinit 1<<28
using namespace std;
vector<int>g[lmax];
int n,m,e,match[lmax],dist[lmax];
bool bfs()
{
int i,u,v,l;
queue<int>Q;
for(i=1;i<=n;i++)
{
if(match[i]==0)
{
dist[i]=0;
Q.push(i);
}
else
{
dist[i]=infinit;
}
}
dist[0]=infinit;
while(!Q.empty())
{
u=Q.front();
Q.pop();
if(u!=0)
{
l=g[u].size();
for(i=0;i<l;i++)
{
v=g[u][i];
if(dist[match[v]]==infinit)
{
dist[match[v]]=dist[u]+1;
Q.push(match[v]);
}
}
}
}
return (dist[0]!=infinit);
}
bool dfs(int u)
{
int i,v,l;
if(u!=0)
{
l=g[u].size();
for(i=0;i<l;i++)
{
v=g[u][i];
if(dist[match[v]]==dist[u]+1)
{
if(dfs[match[v]])
{
match[v]=u;
match[u]=v;
return true;
}
}
}
dist[u]=infinit;
return false;
}
return true;
}
int hopcroft_karp()
{
int matching=0,i;
while(bfs())
{
for(i=1;i<=n;i++)
{
if(match[i]==0 && dfs(i))
{
matching++;
}
}
}
return matching;
}
int main()
{
int i,a,b;
ifstream fin("cuplaj.in");
ofstream gout("cuplaj.out");
fin>>n>>m>>e;
for(i=1;i<=e;i++)
{
fin>>a>>b;
g[a].push_back(b);
}
a=hopcroft_karp();
gout<<a<<"\n";
for(i=1;i<=n;i++)
{
if(match[i]<=m)
gout<<i<<" "<<match[i]<<"\n";
}
}