Mai intai trebuie sa te autentifici.
Cod sursa(job #958047)
Utilizator | Data | 6 iunie 2013 21:03:55 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.21 kb |
#include<fstream>
#include<cstring>
#include<vector>
#define MAXN 10005
using namespace std;
vector<int> G[MAXN];
int u[MAXN], l[MAXN], r[MAXN];
bool pairup(int x){
if(u[x]) return false;
u[x] = true;
for(vector<int>::iterator it=G[x].begin(); it!=G[x].end(); ++it)
if(!r[*it]){
r[*it] = x;
l[x] =*it;
return true;
}
for(vector<int>::iterator it=G[x].begin(); it!=G[x].end(); ++it)
if(pairup(r[*it])){
r[*it] = x;
l[x] = *it;
return true;
}
return false;
}
int main(){
int n, m, edges, i, j, x, y, sum;
freopen("cuplaj.in", "rt", stdin);
freopen("cuplaj.out", "wt", stdout);
scanf("%d %d %d", &n, &m, &edges);
for(i=0; i<edges; i++){
scanf("%d %d",&x, &y);
G[x].push_back(y);
}
for(bool change=true; change; ){
change = false;
memset(u, 0, sizeof(u));
for(i=1; i<=n; i++)
if(!l[i]) change= change | pairup(i);
}
for(sum=0, i=1; i<=n; i++)
sum+=(l[i]!=0);
printf("%d\n", sum);
for(i=1; i<=n; i++)
if(l[i])printf("%d %d\n", i, l[i]);
fclose(stdin);
fclose(stdout);
return 0;
}