Mai intai trebuie sa te autentifici.
Cod sursa(job #315746)
Utilizator | Data | 17 mai 2009 00:59:39 | |
---|---|---|---|
Problema | Cuplaj maxim in graf bipartit | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.48 kb |
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define Nmax 10001
#define pb push_back
#define sz size
#define Inf 1<<22
#define file_in "cuplaj.in"
#define file_out "cuplaj.out"
#define ll long long
#define ii inline
#define clear(a) memset(a,0,sizeof(a))
vector<int> v[Nmax];
int n,m,e;
int cuplaj1[Nmax];
int cuplaj2[Nmax];
int b,a,ok,nrsol;
int viz[Nmax];
ii bool cupleaza(int nod)
{
int i;
if (viz[nod]==1) return false;
viz[nod]=1;
for (i=0;i<v[nod].sz();++i)
{
if (cuplaj1[v[nod][i]]==0)
{
cuplaj2[nod]=1;
cuplaj1[v[nod][i]]=nod;
return true;
}
}
for (i=0;i<v[nod].sz();++i)
{
if (cuplaj1[v[nod][i]]!=nod && cupleaza(cuplaj1[v[nod][i]]))
{
cuplaj2[nod]=1;
cuplaj1[v[nod][i]]=nod;
return true;
}
}
return false;
}
ii void citire()
{
int i;
freopen(file_in,"r",stdin);
freopen(file_out,"w",stdout);
scanf("%d %d %d", &n,&m,&e);
for (i=1;i<=e;++i)
{
scanf("%d %d", &a,&b);
v[a].pb(b);
}
}
ii void solve()
{
int i;
ok=1;
while(ok)
{
clear(viz);
ok=0;
for (i=1;i<=n;++i)
{
if (cuplaj2[i]==0 && cupleaza(i))
{
ok=1;
nrsol++;
}
}
}
}
ii void scrie()
{
int i;
printf("%d\n", nrsol);
for (i=1;i<=nrsol;++i)
if (cuplaj1[i]!=0)
printf("%d %d\n", i,cuplaj1[i]);
}
int main()
{
citire();
solve();
scrie();
fclose(stdin);
fclose(stdout);
return 0;
}