Pagini recente » Cod sursa (job #1221614) | Cod sursa (job #1972680) | Cod sursa (job #725525) | Cod sursa (job #2380968) | Cod sursa (job #1067718)
#include<cstdio>
#include<cstring>
#include<cassert>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
struct Edge {int x,y,c;} a[305];
int A[55];
int N,M,Oameni,D;
short C[5005][5005];
short F[5005][5005];
int p[5005];
vector<int> G[5005];
vector< pair<int,int> > E[5005];
int MaxFlow;
int BFS()
{
for(int i=1;i<=D;i++)
p[i]=-1;
queue<int> Q;
p[0]=-2;Q.push(0);
while(!Q.empty())
{
int u=Q.front();
for(vector<int>::iterator it=G[u].begin();it!=G[u].end();it++)
if(p[*it]==-1 && F[u][*it]<C[u][*it])
{
Q.push(*it);
p[*it]=u;
}
Q.pop();
}
if(p[D]!=-1)
return 1;
return 0;
}
void Build(int T)
{
for(int i=1;i<=N;i++)
{
G[N*(T-1)+i].push_back(N*T+i);
G[N*T+i].push_back(N*(T-1)+i);
C[N*(T-1)+i][N*T+i]=200;
for(vector< pair<int,int> >::iterator it=E[i].begin();it!=E[i].end();it++)
{
G[N*(T-1)+i].push_back(N*T+it->first);
G[N*T+it->first].push_back(N*(T-1)+i);
C[N*(T-1)+i][N*T+it->first]=it->second;
}
}
}
void AddFlow(int T)
{
Build(T);
D=T*N+1;
while(BFS())
{
int MinFlow=C[p[D]][D]-F[p[D]][D];
for(int u=p[D];u;u=p[u])
MinFlow=min(MinFlow,C[p[u]][u]-F[p[u]][u]);
for(int u=D;u;u=p[u])
{
F[p[u]][u]+=MinFlow;
F[u][p[u]]-=MinFlow;
}
MaxFlow+=MinFlow;
}
}
int main()
{
freopen("algola.in","r",stdin);
freopen("algola.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
{
scanf("%d",&A[i]);
Oameni+=A[i];
G[0].push_back(i);
G[i].push_back(0);
C[0][i]=A[i];
}
for(int a,b,c,i=1;i<=M;i++)
{
scanf("%d%d%d",&a,&b,&c);
E[a].push_back(make_pair(b,c));
E[b].push_back(make_pair(a,c));
}
int t;
for(t=1;MaxFlow<Oameni;t++)
AddFlow(t);
printf("%d\n",t-1);
return 0;
}