Pagini recente » Cod sursa (job #1372916) | Cod sursa (job #1532243) | Cod sursa (job #2696793) | Cod sursa (job #1906300) | Cod sursa (job #1966860)
#include <bits/stdc++.h>
#define maxN 5005
using namespace std;
int source=0,sink=5001;
const int INF=70;
bool seen[maxN];
vector<pair<int,int> >g[maxN];
vector<int >v[maxN];
int cap[maxN][maxN],flow[maxN][maxN];
int tata[maxN],nod,addflow,maxflow;
int n,m,i,j,x,y,z;
void addedge(int x,int y,int c)
{
v[x].push_back(y);
v[y].push_back(x);
cap[x][y]=c;
}
queue<int>Que;
bool bfs()
{
memset(seen,false,sizeof(seen));
Que.push(source);
seen[source]=true;
while(!Que.empty())
{
int nod=Que.front();
Que.pop();
if(nod==sink)
continue;
for(auto it:v[nod])
if(!seen[it] && flow[nod][it]<cap[nod][it])
{
seen[it]=true;
Que.push(it);
tata[it]=nod;
}
}
return seen[sink];
}
int getMaxFlow()
{
int res=0;
while(bfs())
for(auto it:v[sink])
if(seen[it] && flow[it][sink]!=cap[it][sink])
{
tata[sink]=it;
int addflow=INF;
for(nod=sink;nod!=source;nod=tata[nod])
addflow=min(addflow,cap[tata[nod]][nod]-flow[tata[nod]][nod]);
res+=addflow;
for(nod=sink;nod!=source;nod=tata[nod])
flow[tata[nod]][nod]+=addflow,
flow[nod][tata[nod]]-=addflow;
}
return res;
}
int main()
{
freopen("algola.in","r",stdin);
freopen("algola.out","w",stdout);
scanf("%d %d",&n,&m);
int total=0;
for(i=1;i<=n;i++)
{
scanf("%d",&x);
total+=x;
addedge(source,i,x);
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&y,&z);
g[x].push_back({y,z});
g[y].push_back({x,z});
}
addedge(1,sink,INF);
int sol=0;
maxflow=getMaxFlow();
while(maxflow<total)
{
sol++;
for(i=1;i<=n;i++)
{
addedge(n*(sol-1)+i,n*sol+i,INF);
for(auto it:g[i])
addedge(n*(sol-1)+i,n*sol+it.first,it.second);
}
addedge(sol*n+1,sink,INF);
maxflow+=getMaxFlow();
}
printf("%d",sol);
return 0;
}