Pagini recente » Cod sursa (job #1250384) | Cod sursa (job #416781) | Cod sursa (job #538700) | Cod sursa (job #51567) | Cod sursa (job #2433513)
#include<fstream>
#include<vector>
#include<deque>
using namespace std;
ifstream fi("algola.in");
ofstream fo("algola.out");
int n,i,j,a,b,x,y,nr,pax,add,nod,P[2605],C[2605][2605],F[2605][2605],dest,m,f;
vector<int> V[2605];
vector<int>::iterator it;
deque<int> Q;
bool bfs()
{
int i;
vector<int>::iterator it;
for(i=1; i<=2601; i++)
P[i]=0;
int vf;
Q.push_back(1);
P[1]=-1;
while(!Q.empty())
{
vf=Q.front();
Q.pop_front();
for(it=V[vf].begin(); it!=V[vf].end(); it++)
{
if(!P[*it] && C[vf][*it]!=F[vf][*it])
{
P[*it]=vf;
Q.push_back(*it);
}
}
}
return P[dest];
}
int getnode(int nod, int t)
{
return nod*51+t;
}
int main()
{
fi>>n>>m;
for(i=1; i<=n; i++)
{
fi>>x;
b=getnode(i,0);
a=1;
V[a].push_back(b);
V[b].push_back(a);
C[a][b]=x;
pax+=x;
}
for(i=1; i<=m; i++)
{
fi>>x>>y>>nr;
for(j=0; j<50; j++)
{
a=getnode(x,j);
b=getnode(y,j+1);
V[a].push_back(b);
V[b].push_back(a);
C[a][b]=nr;
a=getnode(y,j);
b=getnode(x,j+1);
V[a].push_back(b);
V[b].push_back(a);
C[a][b]=nr;
}
}
for(i=1; i<=n; i++)
{
for(j=0; j<50; j++)
{
a=getnode(i,j);
b=getnode(i,j+1);
V[a].push_back(b);
V[b].push_back(a);
C[a][b]=50;
}
}
dest=getnode(n+1,0);
for(i=0; f<pax; i++)
{
a=getnode(1,i);
b=dest;
V[a].push_back(b);
V[b].push_back(a);
C[a][b]=50;
while(bfs())
{
for(it=V[dest].begin(); it!=V[dest].end(); it++)
{
if(F[(*it)][dest]==C[(*it)][dest] || !P[(*it)])
continue;
add=C[(*it)][dest]-F[(*it)][dest];
nod=*it;
while(nod!=1)
{
add=min(add,C[P[nod]][nod]-F[P[nod]][nod]);
nod=P[nod];
}
f+=add;
F[(*it)][dest]+=add;
F[dest][(*it)]-=add;
nod=*it;
while(nod!=1)
{
F[P[nod]][nod]+=add;
F[nod][P[nod]]-=add;
nod=P[nod];
}
}
}
}
fo<<i-1<<"\n";
fi.close();
fo.close();
return 0;
}