Pagini recente » Cod sursa (job #2052216) | Cod sursa (job #1668632) | Rating Fratila Daniel (fratiladaniel) | Istoria paginii runda/noname | Cod sursa (job #2297545)
#include <bits/stdc++.h>
using namespace std;
void reset(vector <bool> &v)
{
for(unsigned i = 0; i < v.size(); i++)
v[i] = false;
}
bool cupleaza(int k, vector < vector <int>> &path, vector <int> &con_left, vector <int> &con_right, vector <bool> &viz)
{
if(viz[k])
return false;
viz[k] = true;
int vec;
for(unsigned i = 0; i < path[k].size(); i++)
{
vec = path[k][i];
if(con_right[vec] == 0)
{
con_left[k] = vec;
con_right[vec] = k;
return true;
}
}
for(unsigned i = 0; i < path[k].size(); i++)
{
vec = path[k][i];
if(cupleaza(con_right[vec], path, con_left, con_right, viz))
{
con_left[k] = vec;
con_right[vec] = k;
return true;
}
}
return false;
}
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
int main()
{
int left, right, edges, nr_con = 0;
fin>>left>>right>>edges;
vector < vector <int>> path(left + 1);
vector <int> con_left(left + 1, 0);
vector <int> con_right(right + 1, 0);
vector <bool> viz(left + 1);
int x, y;
for(; edges; edges--)
{
fin>>x>>y;
path[x].push_back(y);
}
bool ok = true;
while(ok)
{
ok = false;
reset(viz);
for(int i = 1; i <= left; i++)
{
if(con_left[i] == 0)
{
if(cupleaza(i, path, con_left, con_right, viz))
{
ok = true;
nr_con ++;
}
}
}
}
fout<<nr_con<<'\n';
for(int i = 1; i <= left; i++)
{
if(con_left[i] != 0)
fout<<i<<' '<<con_left[i]<<'\n';
}
return 0;
}