Pagini recente » Cod sursa (job #2818401) | Cod sursa (job #526102) | Cod sursa (job #2375086) | Cod sursa (job #877038) | Cod sursa (job #2818403)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
#define Nmax 100007
#define inf 100000
#define NIL 0
int n,m,e;
vector<int> la[Nmax];
vector <int> pairU;
vector <int> pairV;
vector <int> dist;
bool bfs_cuplaj()
{
queue<int> coada;
for(int i=1;i<=n;i++)
{
//daca nodul e liber
if(pairU[i]==NIL)
{
dist[i]=0;
coada.push(i);
}
else dist[i]=inf;
}
dist[NIL]=inf;
while(!coada.empty())
{
int cur = coada.front();
coada.pop();
if(dist[cur]<dist[NIL])
{
for(auto v:la[cur])
{
if(dist[pairV[v]]==inf)
{
dist[pairV[v]] = dist[cur]+1;
coada.push(pairV[v]);
}
}
}
}
return (dist[NIL]!=inf);
}
bool dfs_cuplaj(int u)
{
if(u!=0)
{
for(auto v:la[u])
{
if(dist[pairV[v]] == dist[u]+1)
{
if(dfs_cuplaj(pairV[v])==true)
{
pairV[v]=u;
pairU[u]=v;
return true;
}
}
}
dist[u]=inf;
return false;
}
return true;
}
void cuplaj()
{
pairU.resize(n+1,NIL);
pairV.resize(m+1,NIL);
dist.resize(e+1,NIL);
int result=0;
while(bfs_cuplaj()) //cat timp exista o augmentare
{
for(int i=1;i<=n;i++)
if(pairU[i] == 0 && dfs_cuplaj(i))
result++;
}
g<<result<<"\n";
for(int i=1;i<=result;i++)
g<<i<<" "<<pairV[i]<<"\n";
}
int main()
{
int x,y;
f>>n>>m>>e;
for(int i=1;i<=e;i++){
f>>x>>y;
la[x].push_back(y);
}
cuplaj();
return 0;
}