Mai intai trebuie sa te autentifici.
Cod sursa(job #1240486)
Utilizator | Data | 11 octombrie 2014 14:12:26 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.18 kb |
#include <cstdio>
#include <vector>
#define Nmax 10005
using namespace std;
int N,M,st[Nmax],dr[Nmax];
bool viz[Nmax];
vector <int> L[Nmax];
inline bool Cupleaza(int nod)
{
if(viz[nod]) return false;
viz[nod]=true;
vector <int>::iterator it;
for(it=L[nod].begin();it!=L[nod].end();++it)
if(!dr[*it])
{
st[nod]=*it; dr[*it]=nod;
return true;
}
for(it=L[nod].begin();it!=L[nod].end();++it)
if(Cupleaza(dr[*it]))
{
st[nod]=*it; dr[*it]=nod;
return true;
}
return false;
}
int main()
{
int K,x,y,sol=0,gata=0,i;
freopen ("cuplaj.in","r",stdin);
freopen ("cuplaj.out","w",stdout);
scanf("%d%d%d", &N,&M,&K);
while(K--)
{
scanf("%d%d", &x,&y);
L[x].push_back(y);
}
while(!gata)
{
gata=1;
for(i=1;i<=N;++i) viz[i]=false;
for(i=1;i<=N;++i)
if(!st[i] && Cupleaza(i))
{
++sol; gata=0;
}
}
printf("%d\n", sol);
for(i=1;i<=N;++i)
if(st[i])
printf("%d %d\n", i,st[i]);
return 0;
}