Pagini recente » Cod sursa (job #1335456) | Cod sursa (job #1073010) | Cod sursa (job #1211057) | Cod sursa (job #1228935) | Cod sursa (job #1099249)
#include <algorithm>
#include <cstdio>
#include <bitset>
#include <vector>
#include <queue>
#define mp make_pair
#define PII pair<int, int>
#define x first
#define y second
using namespace std;
const int N=55, M=5005, INF=0x3f3f3f3f;
int n, flow;
int a[N], C[M][M], F[M][M], Tr[M];
vector <PII> MC[N];
vector <int> G[M];
bitset <M> v;
void build(int m)
{
int i;
for(i=1;i<=n;i++)
{
G[n*(m-1)+i].push_back(n*m+i);
G[n*m+i].push_back(n*(m-1)+i);
C[n*(m-1)+i][n*m+i]=200;
for(auto p: MC[i])
{
G[n*(m-1)+i].push_back(n*m+p.x);
G[n*m+p.x].push_back(n*(m-1)+i);
C[n*(m-1)+i][n*m+p.x]=p.y;
}
}
}
bool bfs(int m)
{
int x;
queue <int> Q;
v.reset();
v[0]=1;
for(Q.push(0);!Q.empty();Q.pop())
{
x=Q.front();
for(auto p: G[x])
{
if(v[p]||C[x][p]==F[x][p]) continue;
Q.push(p);
v[p]=1;
Tr[p]=x;
}
}
return v[n*m+1];
}
void get_flow(int m)
{
int d=n*m+1, fmin, i;
while(bfs(m))
{
for(auto p: G[d])
{
if(!v[p]||C[p][d]==F[p][d]) continue;
Tr[d]=p;
fmin=INF;
for(i=d;i;i=Tr[i])
{
fmin=min(fmin, C[Tr[i]][i]-F[Tr[i]][i]);
}
if(!fmin) continue;
for(i=d;i;i=Tr[i])
{
F[Tr[i]][i]+=fmin;
F[i][Tr[i]]-=fmin;
}
flow+=fmin;
}
}
}
int main()
{
freopen("algola.in", "r", stdin);
freopen("algola.out", "w", stdout);
int m, i, x, y, z, s=0;
scanf("%d%d", &n, &m);
for(i=1;i<=n;i++)
{
scanf("%d", &a[i]);
s+=a[i];
G[0].push_back(i);
G[i].push_back(0);
C[0][i]=a[i];
}
while(m--)
{
scanf("%d%d%d", &x, &y, &z);
MC[x].push_back(mp(y, z));
MC[y].push_back(mp(x, z));
}
for(i=1;flow<s;i++)
{
build(i);
get_flow(i);
}
printf("%d", i-1);
}