Pagini recente » Cod sursa (job #1476438) | Cod sursa (job #220342) | Cod sursa (job #1929836) | Cod sursa (job #622493) | Cod sursa (job #362312)
Cod sursa(job #362312)
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;
#define DIM 10001
int l[DIM], r[DIM], mod[DIM];
int n, m, nm;
vector<int> la[DIM];
int cupleaza(int nod)
{
if(mod[nod]) return 0;
mod[nod] = 1;
vector<int> :: iterator it;
for(it = la[nod].begin(); it != la[nod].end(); ++it)
{
if(r[*it] == 0) //daca vecinul curent e necuplat
{
r[*it] = nod;
l[nod] = *it;
return 1;
}
}
for(it = la[nod].begin(); it != la[nod].end(); ++it)
{
if(cupleaza(r[*it])) //incerc sa recuplez pe cel cu care vecinul este cuplat ca sa pot cupla nod cu vecinul sau
{
r[*it] = nod;
l[nod] = *it;
return 1;
}
}
return 0; //nu am reusit sa cuplez nodul
}
inline void noMod() { memset(mod, 0, DIM * sizeof(int)); }
void scrie()
{
int noduriCuplate = 0, i;
for(i = 1; i <= n; ++i) if(l[i] > 0) noduriCuplate++;
ofstream fo("cuplaj.out");
fo << noduriCuplate << "\n";
for(i = 1; i <= n; ++i) if(l[i] > 0) fo << i << " " << l[i] << "\n";
fo.close();
}
void rezolva()
{
int schimbare = 1, i;
while(schimbare)
{
schimbare = 0;
noMod();
for(i = 1; i <= n; ++i)
if(!l[i])
if(cupleaza(i))
schimbare = 1;
}
}
void citeste()
{
ifstream fi("cuplaj.in");
fi >> n >> m >> nm;
int i, x, y;
for(i = 1; i <= nm; ++i)
{
fi >> x >> y;
la[x].push_back(y);
}
fi.close();
}
int main()
{
citeste();
rezolva();
scrie();
return 0;
}