Pagini recente » Cod sursa (job #2120606) | Cod sursa (job #2917947) | Cod sursa (job #1579199) | Cod sursa (job #2197338) | Cod sursa (job #1549407)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#define NMAX 20003
int C[NMAX];
bool viz[NMAX];
int len[NMAX];
vector<int> vecini[NMAX];
int n;
int na, nb;
void init();
void adaugaVecin(int nod, int i);
struct cuplaj{
int x, y;
};
void adaugaVecin(int i, int j){
vecini[i].push_back(j);
len[i]++;
vecini[j].push_back(i);
len[j]++;
}
void init(){
for(int i=0; i<=n; i++){
C[i] = -1;
}
}
void clearViz(int n){
for(int i=0; i<=n; i++)
viz[i] = false;
}
void read(){
int x;
fin>>na;
fin>>nb;
n = na+nb;
init();
fin>>x;
for(int i=1; i<=x; i++){
int a, b;
fin>>a>>b;
b += na;
adaugaVecin(a, b);
}
}
int DFS(int i){
viz[i] = true;
for(int j=0; j<len[i]; j++){
int k = vecini[i][j];
if(viz[k] || C[i] == k)continue;
if(C[k] == -1){/// Daca e Nelegat
viz[k] = true;
C[k] = i;
C[i] = k;
return 1;
}else{/// DACA E LEGAT
viz[k] = true;
if(DFS(C[k])){
C[k] = i;
C[i] = k;
return 1;
}
else continue;
}
}
return 0;
}
int main()
{
read();
/*for(int i=1; i<=na; i++){
if(C[vecini[i][0]] == -1 && C[i] == -1){
C[i] = vecini[i][0];
C[vecini[i][0]] = i;
}
}
*/
bool ok = true;
while(ok){
clearViz(n);
ok = false;
for(int i=1; i<=na; i++){
if(!viz[i] && C[i] == -1)
if(DFS(i))ok = true;
}
}
cuplaj match[NMAX];
int length = 0;
clearViz(n);
for(int i=1; i<=n; i++){
if(C[i] != -1 && !viz[i]){
match[length].x = i;
match[length].y = C[i]-na;
length++;
viz[i] = viz[C[i]] = true;
}
}
fout<<length<<'\n';
for(int i=0; i<length; i++){
fout<<match[i].x<<' '<<match[i].y<<'\n';
}
}