Pagini recente » Cod sursa (job #56935) | Cod sursa (job #1214289) | Cod sursa (job #1557941) | Cod sursa (job #2037113) | Cod sursa (job #2344725)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define NMAX 10005
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int cardinal_stanga, cardinal_dreapta, nr_muchii, vecin_dreapta[NMAX], vecin_stanga[NMAX];
vector<int>graph[NMAX];
bool ok;
int viz[NMAX];
bool cuplaj (int ind)
{
if (viz[ind])
return false;
viz[ind]=true;
for (auto &v:graph[ind])
{
if (!vecin_stanga[v])
{
vecin_dreapta[ind]=v;
vecin_stanga[v]=ind;
return true;
}
}
for (auto &v:graph[ind])
{
if (cuplaj(vecin_stanga[v]))
{
vecin_dreapta[ind]=v;
vecin_stanga[v]=ind;
return true;
}
}
}
int main() {
int st, dr;
f >> cardinal_stanga >> cardinal_dreapta >> nr_muchii;
for (int i=1; i<=nr_muchii; i++)
{
f >> st >> dr;
graph[st].push_back(dr);
}
ok=true;
while (ok)
{
ok=false;
memset(viz,0,NMAX);
for (int i=1; i<=cardinal_stanga; i++)
{
if (!vecin_dreapta[i])
{
ok=ok|cuplaj(i);
}
}
}
int nr=0;
for (int i=1; i<=cardinal_stanga; ++i)
{
if (vecin_dreapta[i])
nr++;
}
g << nr << '\n';
for (int i=1; i<=cardinal_stanga; ++i)
{
if (vecin_dreapta[i])
{
g << i <<' ' << vecin_dreapta[i] << '\n';
}
}
return 0;
}