Pagini recente » Cod sursa (job #2672469) | Cod sursa (job #1928374) | Cod sursa (job #2370138) | Cod sursa (job #2173493) | Cod sursa (job #467816)
Cod sursa(job #467816)
#include <stdio.h>
#include <string.h>
#include <vector>
#define NMAX 55
#define INF 2000000000
#define pb push_back
using namespace std;
int n,m,A[NMAX],C[NMAX][NMAX],F[NMAX][NMAX],dad[NMAX],Q[NMAX],sum,timp;
vector <int> B[NMAX];
char viz[NMAX];
void read()
{
scanf("%d%d",&n,&m);
int i,x,y,z;
for (i=1; i<=n; i++)
scanf("%d",&A[i]);
A[1]=0;
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&x,&y,&z);
C[x][y]=z; C[y][x]=z;
B[x].pb(y);
B[y].pb(x);
}
for (i=2; i<=n; i++)
{
B[0].pb(i);
B[i].pb(0);
C[0][i]=A[i];
}
}
int BF()
{
Q[0]=1; Q[1]=0;
memset(viz,0,sizeof(viz));
viz[0]=1;
int i,j,nod,vec;
for (i=1; i<=Q[0]; i++)
{
nod=Q[i];
for (j=0; j<B[nod].size(); j++)
{
vec=B[nod][j];
if (C[nod][vec]==F[nod][vec] || viz[vec])
continue ;
viz[vec]=1;
Q[++Q[0]]=vec;
dad[vec]=nod;
if (vec==1)
return 1;
}
}
return 0;
}
void init()
{
int i,j;
for (i=0; i<=n; i++)
for (j=0; j<=n; j++)
F[i][j]=0;
for (i=2; i<=n; i++)
C[0][i]=A[i];
}
void actualizare()
{
int i;
sum=0;
for (i=2; i<=n; i++)
{
A[i]-=F[0][i];
sum+=A[i];
}
}
void solve()
{
int nod,fmin;
while (1)
{
timp++;
init();
while (BF())
{
fmin=INF;
for (nod=1; nod!=0; nod=dad[nod])
fmin=min(fmin,C[dad[nod]][nod]-F[dad[nod]][nod]);
for (nod=1; nod!=0; nod=dad[nod])
{
F[dad[nod]][nod]+=fmin;
F[nod][dad[nod]]-=fmin;
}
}
actualizare();
if (sum==0)
break ;
}
}
int main()
{
freopen("algola.in","r",stdin);
freopen("algola.out","w",stdout);
read();
solve();
printf("%d\n",timp);
return 0;
}