Pagini recente » Cod sursa (job #183566) | Cod sursa (job #2150314) | Cod sursa (job #1837990) | Monitorul de evaluare | Cod sursa (job #2425150)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=20005;
vector<int> v[nmax],aa[nmax];
int start[nmax],q[nmax],lev[nmax],ad[nmax];
int source,sink,n,m,i,j,e,nr,p,u,x,nod,y,flux;
struct edge
{
int to,cap,fl;
}mu[nmax*15];
void add(int x,int y,int c)
{
v[x].push_back(nr);
mu[nr]={y,c,0};
nr++;
v[y].push_back(nr);
mu[nr]={x,0,0};
nr++;
}
bool bfs()
{
q[u=1]=source;
for(i=1;i<=sink;i++)
lev[i]=0;
lev[source]=1;
for(p=1;p<=u;p++)
{
x=q[p];
if(x==sink) return 1;
for(i=0;i<v[x].size();i++)
{
nod=mu[v[x][i]].to;
if((!lev[nod])&&mu[v[x][i]].fl<mu[v[x][i]].cap)
{
lev[nod]=lev[x]+1;
q[++u]=nod;
}
}
}
return 0;
}
int dfs(int x,int minfl)
{
int mm,nod;
if(!minfl) return 0;
if(x==sink) return minfl;
for(start[x];start[x]<aa[x].size();start[x]++)
{
mm=aa[x][start[x]];nod=mu[mm].to;
if(mu[mm].fl<mu[mm].cap)
{
int rec=min(minfl,mu[mm].cap-mu[mm].fl);
int cc=dfs(nod,rec);
if(cc)
{
mu[mm].fl+=cc;
mu[(mm^1)].fl-=cc;
return cc;
}
}
}
return 0;
}
int main()
{
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
f>>n>>m>>e;
source=n+m+1;sink=n+m+2;
for(i=1;i<=n;i++)
add(source,i,1);
for(i=1;i<=m;i++)
add(n+i,sink,1);
for(i=1;i<=e;i++)
{
f>>x>>y;
add(x,n+y,1);
}
while(bfs())
{
bool ok=1;
for(i=1;i<=sink;i++)
start[i]=0;
for(i=1;i<=sink;i++)
{
aa[i].resize(0,0);
for(j=0;j<v[i].size();j++)
if(lev[mu[v[i][j]].to]==lev[i]+1)
{
aa[i].push_back(v[i][j]);
}
}
while(ok)
{
int fl=dfs(source,(1<<30));
ok&=(fl!=0);
flux+=fl;
}
}
g<<flux<<'\n';
for(i=1;i<=n;i++)
{
for(j=0;j<v[i].size();j++)
{
if(mu[v[i][j]].fl==1)
{
g<<i<<' '<<mu[v[i][j]].to-n<<'\n';
}
}
}
return 0;
}