Pagini recente » Cod sursa (job #2331554) | Cod sursa (job #2463050) | Cod sursa (job #1006611) | Cod sursa (job #54809) | Cod sursa (job #2694365)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m,c[1005][1005],f[1005][1005],t[1005],sel[1005],i,x,y,z;
vector <int> v[1005];
static inline void reset()
{
for (int i=1;i<=n;++i)
{
t[i]=-1;
sel[i]=0;
}
}
static inline bool bfs(int s,int d)
{
reset();
queue <int> q;
q.push(s);
sel[s]=1,t[s]=0;
while (!q.empty())
{
int nod=q.front();
q.pop();
for (auto it:v[nod])
{
if (sel[it]==0&&f[nod][it]<c[nod][it])
{
sel[it]=1; t[it]=nod;
if (it==d)
return 1;
q.push(it);
}
}
}
return 0;
}
static inline int flux(int s,int d)
{
int ras=0;
while (bfs(s,d))
{
for (auto frunz:v[d])
{
if (t[frunz]==-1) continue;
int it=frunz;
int nod=it;
int ma=c[it][d]-f[it][d];
while (nod!=s)
{
int tat=t[nod];
ma=min(ma,c[tat][nod]-f[tat][nod]);
nod=tat;
}
ras+=ma;
f[it][d]+=ma;
f[d][it]-=ma;
nod=it;
while (nod!=s)
{
int tat=t[nod];
f[tat][nod]+=ma;
f[nod][tat]-=ma;
nod=tat;
}
}
}
return ras;
}
int main()
{
in>>n>>m;
for (i=1;i<=m;++i)
{
in>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=z;
}
out<<flux(1,n);
return 0;
}