Pagini recente » Cod sursa (job #3148597) | Cod sursa (job #1351580) | Cod sursa (job #2974602) | Cod sursa (job #2812269) | Cod sursa (job #1999452)
#include <bits/stdc++.h>
#define MAXN 5005
#define start 0
#define fin 5001
#define INF 70
using namespace std;
ifstream si("algola.in");
ofstream so("algola.out");
bool viz[MAXN];
vector<pair<int,int> >g[MAXN];
vector<int >v[MAXN];
int cap[MAXN][MAXN],flow[MAXN][MAXN];
int tata[MAXN],nod,fnew,maxf;
void add(int x,int y,int c)
{
v[x].push_back(y);
v[y].push_back(x);
cap[x][y]=c;
}
queue<int> q;
bool bfs()
{
memset(viz,false,sizeof(viz));
q.push(start);
viz[start]=true;
while(!q.empty())
{
int nod=q.front();
q.pop();
if(nod==fin)
continue;
for(auto it:v[nod])
{
if(!viz[it]&&flow[nod][it]<cap[nod][it])
{
viz[it]=true;
q.push(it);
tata[it]=nod;
}
}
}
return viz[fin];
}
int solve()
{
int rez=0;
while(bfs())
{
for(auto it:v[fin])
{
if(viz[it]&&flow[it][fin]!=cap[it][fin])
{
tata[fin]=it;
int fnou=INF;
for(int nod=fin;nod!=start;nod=tata[nod])
{
fnou=min(fnou,cap[tata[nod]][nod]-flow[tata[nod]][nod]);
}
rez+=fnou;
for(int nod=fin;nod!=start;nod=tata[nod])
{
flow[tata[nod]][nod]+=fnou;
flow[nod][tata[nod]]-=fnou;
}
}
}
}
return rez;
}
int main()
{
int n,m;
si>>n>>m;
int sum=0;
int x;
for(int i=1;i<=n;++i)
{
si>>x;
sum+=x;
add(start,i,x);
}
int y,z;
for(int i=1;i<=m;++i)
{
si>>x>>y>>z;
g[x].push_back({y,z});
g[y].push_back({x,z});
}
add(1,fin,INF);
int sol=0;
maxf=solve();
while(maxf<sum)
{
//cout<<maxf<<' ';
sol++;
for(int i=1;i<=n;++i)
{
add(n*(sol-1)+i,n*sol+i,INF);
for(auto it:g[i])
{
add(n*(sol-1)+i,n*sol+it.first,it.second);
}
}
add(n*sol+1,fin,INF);
maxf+=solve();
}
so<<sol;
return 0;
}