Pagini recente » Cod sursa (job #2170236) | Cod sursa (job #69807) | Cod sursa (job #3200307) | Cod sursa (job #3212734) | Cod sursa (job #1162505)
#include<stdio.h>
#include<vector>
using namespace std;
#define nmax 105
#define inf 1000
int n, S, D, i, g1, g2, x, y, j, nrbf, inc, sf, ntd, el, fmin, nod, s1;
int co[2*nmax], viz[2*nmax], t[2*nmax], td[2*nmax], cap[2*nmax][2*nmax];
vector <int> ma[2*nmax];
vector <int> ::iterator it;
void citire()
{
scanf("%ld",&n);
S=0; D=2*n+1;
for (i=1;i<=n;i++)
{
scanf("%ld %ld",&g1,&g2);
s1+=g1;
x=i; y=i+n;
ma[S].push_back(x); cap[S][x]=g1;
ma[x].push_back(S);
ma[y].push_back(D); cap[y][D]=g2;
ma[D].push_back(y);
}
for (i=1;i<=n;i++)
for (j=n+1;j<=2*n;j++)
if (i!=j-n)
{
ma[i].push_back(j); cap[i][j]=1;
ma[j].push_back(i);
}
}
void bfs()
{
nrbf++; ntd=0;
co[1]=S; viz[S]=nrbf;
inc=sf=1;
while (inc<=sf)
{
el=co[inc]; inc++;
for (it=ma[el].begin();it!=ma[el].end();it++)
if (cap[el][*it]>0)
{
if (viz[*it]<nrbf)
{
co[++sf]=*it; viz[*it]=nrbf;
t[*it]=el;
}
if (*it==D)
td[++ntd]=el;
}
}
}
void rezolvare()
{
while (1)
{
bfs();
if (viz[D]==nrbf)
for (i=1;i<=ntd;i++)
{
t[D]=td[i];
fmin=inf;
nod=D;
while ((nod>S)&&(fmin>0))
{
if (fmin>cap[t[nod]][nod])
fmin=cap[t[nod]][nod];
nod=t[nod];
}
nod=D;
if (fmin>0)
while (nod>S)
{
cap[t[nod]][nod]-=fmin;
cap[nod][t[nod]]+=fmin;
nod=t[nod];
}
}
else
break;
}
}
void afisare()
{
printf("%ld\n",s1);
for (i=1;i<=n;i++)
for (j=n+1;j<=2*n;j++)
if ((cap[i][j]==0)&&(i!=j-n))
printf("%ld %ld\n",i,j-n);
}
int main()
{
freopen("harta.in","r",stdin);
freopen("harta.out","w",stdout);
citire();
rezolvare();
afisare();
return 0;
}