Pagini recente » Cod sursa (job #303772) | Cod sursa (job #139580) | Cod sursa (job #485041) | Cod sursa (job #2071185) | Cod sursa (job #1251383)
#include <fstream>
#include <vector>
#define Nmax 10100
#define Neighbour Graph[Node][i]
using namespace std;
vector <int> Graph[Nmax];
int N, M, paint, Solution, Wall[Nmax], Left[Nmax], Right[Nmax];
bool hookUp(int Node) {
int i;
if(Wall[Node] == paint)
return false;
Wall[Node] = paint;
for(i = 0; i < Graph[Node].size(); i++)
if(Left[Neighbour] == 0) {
Right[Node] = Neighbour;
Left[Neighbour] = Node;
return true;
}
for(i = 0; i < Graph[Node].size(); i++)
if(hookUp(Left[Neighbour])) {
Left[Neighbour] = Node;
Right[Node] = Neighbour;
return true;
}
return false;
}
void Solve() {
int i, last = -1;
while(last < Solution) {
last = Solution;
for(i = 1; i <= N; i++)
if(Right[i] == 0) {
++paint;
if(hookUp(i))
++Solution;
}
}
}
void Read() {
int x, y, E;
ifstream in("cuplaj.in");
in >> N >> M >> E;
while(E--) {
in >> x >> y;
Graph[x].push_back(y);
}
in.close();
}
void Write() {
ofstream out("cuplaj.out");
out << Solution << '\n';
for(int i = 1; i <= N; i++)
if(Right[i] != 0)
out << i << ' ' << Right[i] << '\n';
out.close();
}
int main() {
Read();
Solve();
Write();
return 0;
}