Pagini recente » IAP #3: Infoarena3 | Cod sursa (job #943333) | Cod sursa (job #565699) | Cod sursa (job #2243136) | Cod sursa (job #1934085)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout ("cuplaj.out");
const int N = 10005;
vector <int> nodes[N];
bitset <N> visited;
int leftNode[N], rightNode[N];
int leftSize, rightSize, totalEdges, contor;
inline void readVariables(){
fin >> leftSize >> rightSize >> totalEdges;
int origin, destination;
for ( int index = 1; index <= totalEdges; index++ ){
fin >> origin >> destination;
nodes[origin].push_back(destination);
}
}
int augmentation(int node){
if ( visited[node] )
return 0;
visited[node] = true;
for ( auto it : nodes[node] ){
if ( !leftNode[it] ){
leftNode[it] = node;
rightNode[node] = it;
return 1;
}
}
for ( auto it : nodes[node] ){
if ( augmentation(it) ){
leftNode[it] = node;
rightNode[node] = it;
return 1;
}
}
return 0;
}
bool checkCompatibility(){
bool okay = 0;
for ( int index = 1; index <= leftSize; index++ ){
visited[index] = 0;
}
for ( int index = 1; index <= leftSize; index++ ){
if ( !rightNode[index] and augmentation(index) ){
contor++;
okay = 1;
}
}
return okay;
}
void solveProblem(){
for ( ; checkCompatibility(); );
fout << contor << "\n";
for ( int index = 1; index <= leftSize; index++ )
if ( rightNode[index] )
fout << index << " " << rightNode[index] << "\n";
}
int main(){
readVariables();
solveProblem();
}