Pagini recente » Cod sursa (job #2550595) | preONI 2008 - Runda Finala | Cod sursa (job #6722) | Cod sursa (job #2857461) | Cod sursa (job #1523701)
#include <cstdio>
#include <vector>
#define MAXN 10010
#define MAXM 10010
//#define foreach(i,v) for(vector<int>::iterator it = v.begin();it!=v.end();++it)
using namespace std;
int n,m,r,viz[MAXN],L[MAXN],R[MAXM],sum;
vector <int> v[MAXN];
int augment(int k)
{
if(viz[k]==1)return 0;
viz[k]=1;
for(vector<int>::iterator y = v[k].begin();y!=v[k].end();++y)
if(R[*y]==0)
{
R[*y]=k;
L[k]=*y;
return 1;
}
for(vector<int>::iterator y = v[k].begin();y!=v[k].end();++y)
if(augment(R[*y]))
{
R[*y]=k;
L[k]=*y;
return 1;
}
return 0;
}
int main()
{
int x,y;
int ok=1;
FILE *f=fopen("cuplaj.in","r");
FILE *g=fopen("cuplaj.out","w");
fscanf(f,"%d %d %d",&n,&m,&r);
for(int i=1;i<=r;i++)
{
fscanf(f,"%d %d",&x,&y);
v[x].push_back(y);
}
while(ok)
{
ok=0;
for(int i=1;i<=n;i++)viz[i]=0;
for(int i=1;i<=n;i++)
if(L[i]==0)
{
ok=ok|augment(i);
}
}
for(int i=1;i<=n;i++)if(L[i])sum++;
fprintf(g,"%d\n",sum);
for(int i=1;i<=n;i++)if(L[i])fprintf(g,"%d %d\n",i,L[i]);
fclose(f);
fclose(g);
return 0;
}