Pagini recente » Cod sursa (job #1949484) | Cod sursa (job #247566) | Cod sursa (job #3126914) | Cod sursa (job #621164) | Cod sursa (job #2648124)
#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;
}