Mai intai trebuie sa te autentifici.
Cod sursa(job #301328)
Utilizator | Data | 8 aprilie 2009 09:41:50 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 16 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 0.94 kb |
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
const int N_MAX = 10001;
int n,m,e, rez;
bool view[N_MAX];
int cuplaj[N_MAX];
vector<int> G[N_MAX];
int pair_up ( int nod ) {
if (view[nod])
return 0;
for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
if (!cuplaj[*it]) {
cuplaj[*it] = nod;
return 1;
}
}
for (vector<int>::iterator it = G[nod].begin(); it != G[nod].end(); ++it) {
if (cuplaj[*it] != nod && pair_up(cuplaj[*it])) {
cuplaj[*it] = nod;
return 1;
}
}
return 0;
}
int main() {
freopen("cuplaj.in","rt",stdin);
freopen("cuplaj.out","wt",stdout);
scanf("%d %d %d",&n,&m,&e);
for (int i = 0, a,b; i < e; ++i) {
scanf("%d %d",&a,&b);
G[a].push_back(b);
}
for (int i = 1; i <= n; ++i) {
memset(view,sizeof(bool)*N_MAX,0);
rez += pair_up(i);
}
printf("%d\n",rez);
for (int i = 1; i <= m; ++i)
if (!cuplaj[i])
printf("%d %d\n",cuplaj[i],i);
return 0;
}