Pagini recente » Cod sursa (job #256245) | Cod sursa (job #119565) | Cod sursa (job #1146861) | Cod sursa (job #1671233) | Cod sursa (job #927019)
Cod sursa(job #927019)
#include<fstream>
#define N 10002
#define inf 32000
using namespace std;
int na,nb,m,i,x,y,n,cap[N][N],flux[N][N],t[N],Q[N],rez,sol[2][N];
struct nod{int info;nod*adr;}*v[N],*q,*p;
int bfs(int s,int d)
{int i,nd,p=1,u=1;
for(i=1;i<=n;i++) t[i]=0;
Q[1]=s;
while(p<=u)
{
nd=Q[p++];
q=v[nd];
while(q)
{
if(!t[q->info] && cap[nd][q->info]>flux[nd][q->info])
{
Q[++u]=q->info;
t[q->info]=nd;
}
q=q->adr;
}
}
return t[d];
}
void ek(int s,int d)
{int i;
while(bfs(s,d))
{
for(i=d;i!=s;i=t[i])
flux[t[i]][i]++,
flux[i][t[i]]--;
rez++;
sol[0][rez]=t[t[d]]-1;
sol[1][rez]=t[d]-na-1;
}
}
void init()
{int i;
n=na+nb+2;
for(i=2;i<=na+1;i++)
{
cap[1][i]=1;
p=new nod;
p->info=1; p->adr=v[i]; v[i]=p;
p=new nod;
p->info=i; p->adr=v[1]; v[1]=p;
}
for(i=na+2;i<n;i++)
{
cap[i][n]=1;
p=new nod;
p->info=i; p->adr=v[n]; v[n]=p;
p=new nod;
p->info=n; p->adr=v[i]; v[i]=p;
}
}
int main()
{
ifstream f("cuplaj.in");ofstream g("cuplaj.out");
f>>na>>nb>>m;
for(i=1;i<=m;i++)
{
f>>x>>y;
x++; y = 1+na+y;
cap[x][y]=1;
p=new nod;
p->info=y; p->adr=v[x]; v[x]=p;
p=new nod;
p->info=x; p->adr=v[y]; v[y]=p;
}
init();
ek(1,n);
g<<rez<<"\n";
for(i=1;i<=rez;i++)
g<<sol[0][i]<<" "<<sol[1][i]<<"\n";
f.close();g.close();
return 0;
}