Pagini recente » Cod sursa (job #2218991) | Cod sursa (job #620371) | Cod sursa (job #3140765) | Cod sursa (job #28409) | Cod sursa (job #1454469)
#include <fstream>
#include <vector>
#include <queue>
#define Nmax 305
#define INF 2000000000
#define Nrmax 5055
#define pb push_back
using namespace std;
int Nr[Nmax],x[Nmax],y[Nmax],l[Nmax],n,m,S,D,timp,tata[Nrmax];
int Cap[Nrmax][Nrmax],F[Nrmax][Nrmax];
vector <int> L[Nrmax];
queue <int> Q;
inline void addEdge(int x, int y, int C)
{
L[x].pb(y); L[y].pb(x);
Cap[x][y]=C; Cap[y][x]=0;
}
inline int Cod(int x, int y)
{
return y*n+x;
}
inline bool Bfs()
{
int i;
while(!Q.empty()) Q.pop();
for(i=S;i<=Cod(n,timp);++i) tata[i]=-1;
Q.push(S); tata[S]=0;
while(!Q.empty())
{
int nod=Q.front(); Q.pop();
if(nod==D) return true;
for(auto it : L[nod])
{
if(tata[it]!=-1 || F[nod][it]==Cap[nod][it]) continue;
tata[it]=nod; Q.push(it);
}
}
return false;
}
int main()
{
int i,total=0,flow=0;
ifstream cin ("algola.in");
ofstream cout ("algola.out");
cin>>n>>m;
for(i=1;i<=n;++i) cin>>Nr[i];
for(i=1;i<=m;++i) cin>>x[i]>>y[i]>>l[i];
for(i=1;i<=n;++i)
if(Nr[i])
{
addEdge(0,Cod(i,0),Nr[i]);
total+=Nr[i];
}
for(timp=0;timp<=100;++timp)
{
if(timp)
{
for(i=1;i<=n;++i) addEdge(Cod(i,timp-1),Cod(i,timp),200);
for(i=1;i<=m;++i)
{
addEdge(Cod(x[i],timp-1),Cod(y[i],timp),l[i]);
addEdge(Cod(y[i],timp-1),Cod(x[i],timp),l[i]);
}
}
D=Cod(1,timp);
while(Bfs())
{
int minflow=200;
for(int i=D;i!=S;i=tata[i]) minflow=min(minflow,Cap[tata[i]][i]-F[tata[i]][i]);
for(int i=D;i!=S;i=tata[i])
{
F[tata[i]][i]+=minflow;
F[i][tata[i]]-=minflow;
}
flow+=minflow;
}
if(flow==total)
{
cout<<timp<<"\n"; return 0;
}
}
return 0;
}