Pagini recente » Cod sursa (job #751034) | Cod sursa (job #127036) | Cod sursa (job #1948085) | Cod sursa (job #832337) | Cod sursa (job #2085998)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>
#include <cstring>
#include <cstdio>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <set>
#include <map>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <bitset>
#include<thread>
using namespace std;
const int n = 10010;
vector<int> L[n];
int Left[n], Right[n];
bool viz[n];
int lNum, rNum, eNum;
bool DFS(int currentNode)
{
if (viz[currentNode])
return false;
viz[currentNode] = true;
int lg = L[currentNode].size();
for (int i = 0; i < lg; ++i)
{
int node = L[currentNode][i];
if (!Left[node]) //nu este cuplat
{
Left[node] = currentNode;
Right[currentNode] = node;
return true;
}
}
for (int i = 0; i < lg; ++i)
{
int node = L[currentNode][i];
if (DFS(Left[node]))
{
Left[node] = currentNode;
Right[currentNode] = node;
return true;
}
}
return false;
}
void Hopcroft_Karp()
{
bool finish = false;
while (!finish)
{
finish = true;
for (int i = 1; i <= lNum; ++i)
viz[i] = false;
for (int i = 1; i <= lNum; ++i)
{
if (!Right[i])
{
if (DFS(i))
finish = false;
}
}
}
}
int main()
{
ifstream fin("cuplaj.in");
fin >> lNum >> rNum >> eNum;
int x, y;
for (int i = 0; i < eNum; ++i)
{
fin >> x >> y;
L[x].push_back(y);
}
fin.close();
Hopcroft_Karp();
ofstream fout("cuplaj.out");
int rez = 0;
for (int i = 1; i <= lNum; ++i)
{
if (Right[i])
rez++;
}
fout << rez << "\n";
for (int i = 1; i <= lNum; ++i)
{
if (Right[i])
fout << i << " " << Right[i] << "\n";
}
fout.close();
return 0;
}