Pagini recente » Cod sursa (job #1387838) | Cod sursa (job #2271433) | Monitorul de evaluare | Cod sursa (job #1503438) | Cod sursa (job #2267111)
#include <cstdio>
#include <vector>
#include <queue>
using namespace std;
vector<int> U[10005];
vector<int> V[10005];
int pair_u[10005];
int pair_v[10005];
int dist[10005];
queue<int> q;
int n;
bool viz[10005];
const int INF = 2000000000;
bool bfs()
{
int i;
for(i=1; i<=n; i++)
if(pair_u[i]==0){
dist[i]=0;
q.push(i);
}
else
dist[i]=INF;
dist[0]=INF;
while(!q.empty()){
int u=q.front();
q.pop();
if(dist[u]<dist[0]){
for(i=0; i<U[u].size(); i++){
int v=U[u][i];
if(dist[pair_v[v]]==INF){
dist[pair_v[v]]=dist[u]+1;
q.push(pair_v[v]);
}
}
}
}
return dist[0]!=INF;
}
bool dfs(int nod)
{
if(nod!=0){
for(int i=0; i<U[nod].size(); i++){
int v=U[nod][i];
if(dist[pair_v[v]]==dist[nod]+1)
if(dfs(pair_v[v])==true){
pair_v[v]=nod;
pair_u[nod]=v;
return true;
}
}
dist[nod]=INF;
return false;
}
return true;
}
int main()
{ freopen("cuplaj.in", "r",stdin);
freopen("cuplaj.out", "w",stdout);
int m,e,i,x,y,match;
scanf("%d%d%d", &n, &m, &e);
for(i=1; i<=e; i++){
scanf("%d%d", &x, &y);
U[x].push_back(y);
V[y].push_back(x);
}
for(i=1; i<=n; i++)
pair_u[i]=0;
for(i=1; i<=m; i++)
pair_v[i]=0;
match=0;
while(bfs()==true)
for(i=1; i<=n; i++)
if(pair_u[i]==0)
if(dfs(i)==true)
match++;
printf("%d\n", match);
for(i=1; i<=n; i++)
if(pair_u[i]!=0)
printf("%d %d\n", i, pair_u[i]);
return 0;
}