Pagini recente » Cod sursa (job #584995) | Cod sursa (job #792998) | Cod sursa (job #504349) | Cod sursa (job #3167067) | Cod sursa (job #2696288)
#include <bits/stdc++.h>
using namespace std;
#define INF (1<<30)
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector<int> adj[10003];
int n, m, e, pu[10003], pv[10003], d[10003];
bool bfs()
{
queue<int> q;
for(int i=1; i<=n; ++i)
{
if(pu[i]==0)
{
d[i]=0;
q.push(i);
}
else d[i]=INF;
}
d[0]=INF;
while(!q.empty())
{
int i=q.front();
q.pop();
if(d[i]<d[0])
{
for(auto j:adj[i])
{
if(d[pv[j]]==INF)
{
d[pv[j]]=d[i]+1;
q.push(pv[j]);
}
}
}
}
return d[0]!=INF;
}
bool dfs(int u)
{
if(u!=0)
{
for(auto v:adj[u])
{
if(d[pv[v]]==d[u]+1)
{
if(dfs(pv[v]))
{
pv[v]=u;
pu[u]=v;
return 1;
}
}
}
d[u]=INF;
return 0;
}
return 1;
}
int solve()
{
for(int u=1; u<=n; ++u) pu[u]=0;
for(int v=1; v<=m; ++v) pv[v]=0;
int sol=0;
while(bfs())
{
for(int u=1; u<=n; ++u)
{
if(pu[u]==0)
{
sol+=dfs(u);
}
}
}
return sol;
}
int main()
{
fin>>n>>m>>e;
for(int i=1; i<=e; ++i)
{
int a, b;
fin>>a>>b;
adj[a].push_back(b);
}
fout<<solve()<<"\n";;
for(int i=1; i<=n; ++i)
{
if(pu[i]) fout<<i<<" "<<pu[i]<<"\n";
}
return 0;
}