Pagini recente » Cod sursa (job #179427) | Cod sursa (job #2551282) | Cod sursa (job #67799) | Cod sursa (job #2741171) | Cod sursa (job #1003913)
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define N 5005
#define INF 999999999
using namespace std;
ifstream f("algola.in");
ofstream g("algola.out");
int i,x,y,n,m,timp,sursa,dest,sol,co,sumat,fluxt,mini,viz[N],c[N][N],flux[N][N],t[N];
queue<int>q;
vector<int>v1[N];
vector<pair<int,int> >v[N];
inline int bellman_ford()
{
memset(viz,0,sizeof(viz));
q.push(sursa);
viz[sursa]=1;
while(!q.empty())
{
x=q.front();
q.pop();
if(x==dest)
continue;
for(vector<int>::iterator it=v1[x].begin();it!=v1[x].end();++it)
if(!viz[*it]&&c[x][*it]>flux[x][*it])
{
viz[*it]=1;
q.push(*it);
t[*it]=x;
}
}
return viz[dest];
}
int main()
{
f>>n>>m;
sursa=0;
dest=n+1;
for(i=1;i<=n;++i)
{
f>>x;
sumat+=x;
v1[sursa].push_back(i);
v1[i].push_back(sursa);
c[sursa][i]=x;
}
for(i=1;i<=m;++i)
{
f>>x>>y>>co;
v[x].push_back(make_pair(y,co));
v[y].push_back(make_pair(x,co));
}
sol=1;
while(fluxt<sumat)
{
for(i=1;i<=n;++i)
{
x=n*(sol-1)+i;
v1[x].push_back(x+n);
v1[x+n].push_back(x);
c[x][x+n]=INF;
for(vector<pair<int,int> >::iterator it=v[i].begin();it!=v[i].end();++it)
{
y=n*sol+it->first;
v1[x].push_back(y);
v1[y].push_back(x);
c[x][y]=it->second;
}
}
dest=sol*n+1;
while(bellman_ford())
{
for(vector<int >::iterator it=v1[dest].begin();it!=v1[dest].end();++it)
if(viz[*it]&&flux[*it][dest]<c[*it][dest])
{
mini=INF;
t[dest]=*it;
x=dest;
while(x)
{
mini=min(mini,c[t[x]][x]-flux[t[x]][x]);
x=t[x];
}
x=dest;
while(x)
{
flux[t[x]][x]+=mini;
flux[x][t[x]]-=mini;
x=t[x];
}
fluxt+=mini;
}
}
++sol;
}
g<<sol-1<<'\n';
return 0;
}