Pagini recente » Cod sursa (job #1033033) | Cod sursa (job #2600708) | Cod sursa (job #2713628) | Cod sursa (job #40183) | Cod sursa (job #12183)
Cod sursa(job #12183)
#include<stdio.h>
#include<string.h>
#define MAXNI 51
#define MAXND 5051
#define MAXT 101
#define MAXMI 302
#define oo 120
#define MIN(x, y) ((x)<(y)?(x):(y))
//#define _DEBUG_
int n, m;
int pop[MAXNI], ps;
int muci[MAXMI][3];
int ladi[MAXNI][MAXNI], ladci[MAXNI][MAXNI];
int gri[MAXNI];
int lad[MAXND][MAXNI*2];
int gr[MAXND];
int ln;
int dest;
int tflux;
short int capl[MAXND][MAXND];
inline void addmuc(int a, int b, int c)
{
lad[a][gr[a]++] = b;
lad[b][gr[b]++] = a;
capl[a][b] = c;
capl[b][a] = 0;
}
int viz[MAXND];
int cl=0, cr=0;
int coada[MAXND];
int par[MAXND];
inline bool drum()
{
memset(viz, 0, sizeof(viz));
viz[0] = true; cl = 0; cr = 1; coada[0] = 0;
int cur, x;
while (cl<cr)
{
cur = coada[cl];
for (int i=gr[cur]-1; i>=0; --i)
{
x = lad[cur][i];
// if (!viz[x] && f[cur][x] < cap[cur][x])
if (!viz[x] && capl[cur][x] > 0)
{
viz[x] = true;
coada[cr++] = x;
par[x] = cur;
if (x==dest) { cl=cr; break; }
}
}
++cl;
}
if (viz[dest]) return true;
else return false;
}
int main(void)
{
freopen("algola.in", "rt", stdin);
freopen("algola.out", "wt", stdout);
int i;
scanf("%d%d", &n, &m);
for (i=1; i<=n; ++i)
scanf("%d", &pop[i]);
for (int i=0, x, y, z; i<m; ++i)
{
scanf("%d%d%d", &x, &y, &z);
muci[i][0] = x; muci[i][1] = y; muci[i][2] = z;
ladci[x][gri[x]] = ladci[y][gri[y]] = z;
ladi[x][gri[x]++] = y;
ladi[y][gri[y]++] = x;
}
// 0 este sursa
// 5000 este destinatia
dest = 5000;
// graf timpul 0
for (i=1; i<=n; ++i)
addmuc(0, i, pop[i]), ps += pop[i];
addmuc(1, dest, oo);
ln = n+1;
int timp, minf;
for (tflux = 0, timp = 0; tflux<ps; ++timp)
{
// adauga muchii pt timp
addmuc(ln, dest, oo);
for (i=1; i<=n; ++i, ++ln)
{
for (int j=0; j<gri[i]; ++j)
addmuc(ln-n-i+ladi[i][j], ln, ladci[i][j]);
addmuc(ln-n, ln, oo);
}
while (drum())
{
minf = oo;
for (i=dest; i!=0; i=par[i])
minf = MIN(minf, capl[par[i]][i]);
for (i=dest; i!=0; i=par[i])
{
capl[par[i]][i] -= minf;
capl[i][par[i]] += minf;
}
tflux += minf;
#ifdef _DEBUG_
for (i=dest; i!=0; i=par[i])
printf("%d ", i);
printf("0 -> baga %d\n", minf);
#endif
}
}
printf("%d\n", timp);
return 0;
}