Pagini recente » Cod sursa (job #886216) | Cod sursa (job #1752081) | Cod sursa (job #1673093) | Cod sursa (job #816057) | Cod sursa (job #2209842)
/*
* Supr* Matching in bipartite graph
*/
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#define NMAX 10005
#define pb push_back
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
vector<int> G[NMAX];
int l[NMAX], r[NMAX], u[NMAX];
int pairup(int n){
if(u[n]) return 0;
u[n] = 1;
for(int i = 0; i<G[n].size(); i++){
if(!r[G[n][i]]){
l[n] = G[n][i];
r[G[n][i]] = n;
return 1;
}
}
for(int i = 0; i<G[n].size(); i++){
if(pairup(r[G[n][i]])){
l[n] = G[n][i];
r[G[n][i]] = n;
return 1;
}
}
return 0;
}
int main(){
int n, m, edg;
f >> n >> m >> edg;
for(int i = 1; i<=edg; i++){
int x, y;
f >> x >> y;
G[x].pb(y);
}
int ch = 1;
while(ch){
ch = 0;
memset(u, 0, sizeof(u));
for(int i = 1; i<=n; i++){
if(!l[i]){
ch |= pairup(i);
}
}
}
int cuplaj = 0;
for(int i = 1; i<=n; i++){
cuplaj += (l[i] > 0);
}
g << cuplaj << '\n';
for(int i = 1; i<=n; i++){
if(l[i] > 0){
g << i << ' ' << l[i] << '\n';
}
}
return 0;
}