Pagini recente » Cod sursa (job #1610707) | Cod sursa (job #1392395) | Cod sursa (job #1721628) | Cod sursa (job #1277038) | Cod sursa (job #1549435)
#include <iostream>
#include <fstream>
using namespace std;
#define N 10000
int l[N],// l[i] = numarul de vecini al lui i
v[N][N],// al j-lea vecin al lui i
nb,// Numarul de noduri din dreapta
na, // numarul de noduri din stanga
c[N] = {-1}, //c[i] = -1 daca i nu este cuplat / c[i]=j daca i este cuplat
viz[N];
int dfs(int i){
viz[i] = 1;
for (int j = 1; j <= l[i]; ++j){
int k = v[i][j];
if (viz[k] || c[i] == k) continue;
viz[k] = 1;
if (c[k] == -1){
c[k] = i;
c[i] = k;
return 1;
}
if (dfs(c[k])){
c[i] = k;
c[k] = i;
return 1;
}
else continue;
}
return 0;
}
int main(){
ifstream f("cuplaj.in");
int e, x, y, j;
f >> na >> nb >> e;
for (int i = 1; i <= na + nb; i++){
c[i] = -1;
}
for (int i = 1; i <= e; i++){
f >> x >> y;
l[x]++;
l[y + na]++;
v[x][l[x]] = y + na;
v[y + na][l[y + na]] = x;
/*
c[x] = y + na;
c[y + na] = x;*/
}
f.close();
int ok = 1;
while (ok){
ok = 0;
for (int i = 1; i <= na + nb; i++){
viz[i] = 0;
}
for (int i = 1; i <= na; i++){
if (!viz[i] && c[i]==-1)
if (dfs(i)) ok = 1;
}
}
ofstream g("cuplaj.out");
int k = 0;
for (int i = 1; i <= na; i++){
if (c[i] != -1) k++;
}
g << k << endl;
for (int i = 1; i <= na; i++){
if (c[i] != -1) g << i << " " << c[i] - na<< endl;
}
return 0;
}