Pagini recente » Cod sursa (job #1229657) | Cod sursa (job #602932) | Cod sursa (job #2534422) | Cod sursa (job #1543631) | Cod sursa (job #750474)
Cod sursa(job #750474)
#include <fstream>
#include <vector>
using namespace std;
const int MAX=10010;
vector <int> muchii[MAX];
int st[MAX],dr[MAX],n,m,e; // valoarea lui st[i] inseamna ca nodul i din stanga e cuplat cu nodul st[i] din dreapta
bool viz[MAX];
bool cupleaza(int x)
{
if(viz[x]) // daca am incercat deja sa amelioram prin x intoarcem fals
return false;
viz[x] = true;
int i,vecin;
for (i=0;i<muchii[x].size();++i)
{
vecin = muchii[x][i];
if (dr[vecin] == 0)
{ // daca avem un vecin care nu e ocupat il cuplam cu nodul x
dr[vecin] = x;
st[x] = vecin;
return true;
}
}
for (i=0;i<muchii[x].size();++i)
{
vecin = muchii[x][i];
if (cupleaza(dr[vecin]))
{ // incercam sa cuplam x cu fiecare vecin si in acelasi timp sa putem cupla "vecinul vecinului" cu un alt nod
st[x] = vecin;
dr[vecin] = x;
return true;
}
}
return false;
}
int main(){
ifstream in("cuplaj.in");
ofstream out("cuplaj.out");
int x,y;
in>>n>>m>>e;
while(e--){
in>>x>>y;
muchii[x].push_back(y);
}
int cardinal=0,i;
bool ok=true;
while (ok)
{ // executam cat timp exista drum de ameliorare
ok = false;
for (i=1;i<=n;++i)
viz[i]=0;
for (i=1;i<=n;++i)
{
if (st[i] == 0 && cupleaza(i) == true) // exista drum de ameliorare
ok = true;
}
}
for (i=1;i<=n;++i)
if (st[i])
cardinal++;
out<<cardinal<<'\n';
for (i=1;i<=n;++i)
{
if (st[i])
out<<i<<' '<<st[i]<<'\n';
}
return 0;
}