Pagini recente » Cod sursa (job #570689) | Cod sursa (job #600700) | Cod sursa (job #1146910) | Cod sursa (job #229695) | Cod sursa (job #517326)
Cod sursa(job #517326)
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<cstring>
#define oo 0x3f3f3f3f
#define pb push_back
int viz[30000],ante[30000],q[30000];
ofstream fout("cuplaj.out");
int S,D,sink,M,surs;
vector<int> G[30000];
int C[10005][10005], F[10005][10005];
bool BFS()
{
memset(ante,0,sizeof(ante));
memset(q,0,sizeof(q));
memset(viz,0,sizeof(viz));
viz[0]=1;
q[++q[0]]=0;
int front=1,u;
vector<int>::iterator it;
while(front<=q[0])
{
u=q[front++];
for(it=G[u].begin();it<G[u].end();it++)
{
if(!viz[*it] && C[u][*it]>F[u][*it])
{
viz[*it]=1;
ante[*it]=u;
q[++q[0]]=*it;
}
}
}
return viz[sink];
}
void solve()
{
int flow,fmin,i;
for(flow=0;BFS();)
{
fmin=oo;
vector<int>::iterator it;
for(it=G[sink].begin();it<G[sink].end();it++)
{
if(viz[*it])
{
fmin=C[*it][sink]-F[*it][sink];
for(i=*it;i>0;i=ante[i])
{
fmin=min(fmin,C[ante[i]][i]-F[ante[i]][i]);
}
F[*it][sink]+=fmin;
F[sink][*it]-=fmin;
for(i=*it;i>0;i=ante[i])
{
F[ante[i]][i]+=fmin;
F[i][ante[i]]-=fmin;
}
flow+=fmin;
}
}
}
fout<<flow<<"\n";
vector<int>::iterator it;
for(i=1;i<=S;i++)
{
for(it=G[i].begin();it<G[i].end();it++)
{
if(F[i][*it]==1)
{
fout<<i<<" "<<*it-S<<"\n";
}
}
}
}
void cit()
{int x,y,i;
ifstream fin("cuplaj.in");
fin>>S>>D>>M;
surs=0;
sink=S+D+1;
while(M--)
{
fin>>x>>y;
G[0].pb(x);
G[x].pb(0);
G[x].pb(S+y);
G[S+y].pb(x);
G[S+y].pb(S+D+1);
G[S+D+1].pb(S+y);
C[0][x]=1;
C[x][S+y]=1;
C[S+y][sink]=1;
}
/*for(i=1;i<=S;i++)
{
G[0].pb(i);
G[i].pb(0);
C[0][i]=1;
}
for(i=1;i<=D;i++)
{
C[S+i][sink]=1;
G[sink].pb(S+i);
G[S+i].pb(sink);
}*/
}
int main()
{
cit();
solve();
fout.close();
return 0;
}