Pagini recente » Cod sursa (job #1024863) | Cod sursa (job #420367) | Cod sursa (job #2984406) | Cod sursa (job #30695) | Cod sursa (job #418370)
Cod sursa(job #418370)
#include <cstdio>
#include <vector>
using namespace std;
vector <int> succ[210];
int n,f,coada[210],tat[210],cap[210][210],fl[210][210];
const int inf=1<<30;
int flux()
{
memset(coada,0,sizeof(coada));
memset(tat,0,sizeof(tat));
int r=1,p,minim;
for (p=1;p<=r;++p)
for (int i=0;i<succ[coada[p]].size();++i)
{
int nod=succ[coada[p]][i];
if (!tat[nod]&&cap[coada[p]][nod])
{
tat[nod]=coada[p];
coada[++r]=nod;
}
}
if (!tat[2*n+1])
return 0;
int i=2*n+1;
minim=inf;
while (i)
{
if (minim>cap[tat[i]][i])
minim=cap[tat[i]][i];
i=tat[i];
}
i=2*n+1;
while (i)
{
cap[tat[i]][i]-=minim;
cap[i][tat[i]]+=minim;
fl[tat[i]][i]+=minim;
fl[i][tat[i]]-=minim;
i=tat[i];
}
f+=minim;
return 1;
}
int main()
{
freopen ("harta.in","r",stdin);
freopen ("harta.out","w",stdout);
scanf("%d",&n);
int x,y;
for (int i=1;i<=n;++i)
{
scanf("%d%d",&x,&y);
cap[n+i][2*n+1]=y;
cap[0][i]=x;
for (int j=1;j<=n;++j)
if (i!=j)
{
cap[i][n+j]=1;
succ[i].push_back(n+j);
succ[n+j].push_back(i);
}
succ[0].push_back(i);
succ[i].push_back(0);
succ[n+i].push_back(2*n+1);
succ[2*n+1].push_back(n+i);
}
for (int i=1;i<=n;++i)
printf("%d\n",cap[i+n][2*n+1]);
while (flux());
printf("%d\n",f);
for (int i=1;i<=n;++i)
for (int j=1;j<=n;++j)
if (i!=j&&fl[i][n+j])
printf("%d %d\n",i,j);
return 0;
}