Pagini recente » Cod sursa (job #2200952) | Cod sursa (job #104502) | Cod sursa (job #2579312) | Cod sursa (job #709556) | Cod sursa (job #1125011)
#include <fstream>
#include <vector>
using namespace std;
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
// problema OJI 2012 OZN
int n,k,i,x1,x2,y2,x,j,nr;
int viz[7001],inainte[7001],a,b,c,t,min1,m;
int cap[7001][7001],flux[7001][7001],fluxmax,fx;
vector<int>v[7001];
void DFS(int p)
{viz[p]=1;
for(int i=0;i<v[p].size();i++) if(!viz[v[p][i]]&&flux[p][v[p][i]]<cap[p][v[p][i]]){DFS(v[p][i]);inainte[v[p][i]]=p;}
}
int main()
{f>>n>>k>>m;nr=n;
for(i=1;i<=m;i++) {f>>a>>b;
a=a+1;
b=b+n+2;
v[a].push_back(b);
v[b].push_back(a);
v[1].push_back(a);
v[a].push_back(1);
v[b].push_back(n+m+2);
v[n+m+2].push_back(b);
cap[1][a]=1;
cap[b][n+m+2]=1;
cap[a][b]=1;
}
n=m+n+2;
do{
for(i=1;i<=n;i++) inainte[i]=0;
DFS(1);t=n;min1=10000;
if(!inainte[n])
break;
while(t!=1)
{ if(cap[inainte[t]][t]-flux[inainte[t]][t]<min1) {min1=cap[inainte[t]][t]-flux[inainte[t]][t];}
t=inainte[t];
}
t=n;
while(t!=1)
{ flux[inainte[t]][t]=flux[inainte[t]][t]+min1;
flux[t][inainte[t]]=flux[t][inainte[t]]-min1;
t=inainte[t];
}
for(i=1;i<=n;i++)viz[i]=0;}while(1);
for(i=2;i<=n;i++)
fluxmax+=flux[1][i];
g<<fluxmax<<'\n';
for(i=2;i<n;i++)
for(j=2;j<n;j++) if(flux[i][j]==1) g<<i-1<<" "<<j-nr-2<<'\n';
f.close();
g.close();
return 0;
}