Pagini recente » Cod sursa (job #483676) | Cod sursa (job #319075) | Cod sursa (job #157057) | Cod sursa (job #1223829) | Cod sursa (job #356836)
Cod sursa(job #356836)
#include <stdio.h>
#include <vector>
#include <string.h>
using namespace std;
#define maxn 510
#define maxd 520
long n, m, i, j, k, a, b, cs, t, ok, sol, l, fiu, nod;
long nr[maxn], c[maxd][maxd], f[maxd][maxd], coa[maxd*maxd], tata[maxd], fol[maxd];
vector <long> v[maxn], w[maxn];
long flux()
{
long rez;
memset(tata, 0, sizeof(tata));
memset(fol, 0, sizeof(fol));
fol[0]=1;
l=1;
coa[1]=0;
for(i=1; i<=l && !ok; i++)
{
nod=coa[i];
for(j=1; j<=t*n+1; j++)
{
if(!fol[j] && c[nod][j]-f[nod][j]>0)
{
coa[++l]=j;
tata[j]=nod;
fol[j]=1;
if(j==t*n+1)
{
ok=1;
}
}
}
}
if(!ok) return 0;
nod=t*n+1;
rez=5000;
while(nod!=0)
{
fiu=tata[nod];
if(rez>c[fiu][nod]-f[fiu][nod]) rez=c[fiu][nod]-f[fiu][nod];
nod=fiu;
}
nod=t*n+1;
while(nod!=0)
{
fiu=tata[nod];
f[fiu][nod]+=rez;
f[nod][fiu]-=rez;
nod=fiu;
}
return rez;
}
long bs(long left, long right)
{
long med, rez;
rez=1;
while(left<=right)
{
med=(left+right)/2;
memset(f, 0, sizeof(f));
for(i=1; i<=n; i++)
{
c[0][(t-med)*n+i]=nr[i];
}
ok=1;
sol=0;
while(ok)
{
ok=0;
sol+=flux();
}
if(sol>=nr[0])
{
rez=med;
right=med-1;
}
else
{
left=med+1;
}
for(i=1; i<=n; i++)
{
c[0][(t-med)*n+i]=0;
}
}
return rez;
}
int main()
{
freopen("algola.in", "r", stdin);
freopen("algola.out", "w", stdout);
scanf("%d%d", &n, &m);
t=50;
for(i=0; i<t-1; i++)
{
for(j=1; j<=n; j++)
{
c[j+i*n][j+(i+1)*n]=maxd;
}
}
for(i=1; i<=n; i++)
{
scanf("%d", &nr[i]);
nr[0]+=nr[i];
}
for(i=1; i<=m; i++)
{
scanf("%d%d%d", &a, &b, &cs);
if(a>b) swap(a, b);
for(j=0; j<t-1; j++)
{
c[a+j*n][b+(j+1)*n]+=cs;
c[b+j*n][a+(j+1)*n]+=cs;
}
if(a==1)
{
c[(t-1)*n+b][t*n+1]+=cs;
}
}
c[(t-1)*n+1][t*n+1]=maxd;
printf("%d\n", bs(1, t));
return 0;
}