Pagini recente » Cod sursa (job #824310) | Cod sursa (job #2439257) | Cod sursa (job #458028) | Cod sursa (job #989614) | Cod sursa (job #2546671)
#include<bits/stdc++.h>
using namespace std;
const int maxN=1005;
int c[maxN][maxN],f[maxN][maxN];
vector<int> v[maxN];
bool seen[maxN];
deque<int> q;
int source,destination;
inline void addEdge(int x,int y,int z)
{
c[x][y]=z;
v[x].push_back(y);
v[y].push_back(x);
}
int tt[maxN];
inline bool bfs()
{
memset(seen,0,sizeof(seen));
q.push_back(source);
seen[source]=1;
while(!q.empty())
{
int nod=q.front();
q.pop_front();
for(auto it:v[nod])
{
if(!seen[it] && f[nod][it]<c[nod][it])
{
tt[it]=nod;
seen[it]=1;
q.push_back(it);
}
}
}
return seen[destination];
}
int n,m,x,y,z,sol;
int main()
{
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d%d",&n,&m);
source=1;destination=n;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
addEdge(x,y,z);
}
while(bfs())
{
for(auto it:v[destination])
{
int x=it;
int flow=c[x][destination]-f[x][destination];
for(int i=x;i!=source;i=tt[i])
flow=min(flow,c[tt[i]][i]-f[tt[i]][i]);
f[x][destination]+=flow;
f[destination][x]-=flow;
for(int i=x;i!=source;i=tt[i])
{
f[tt[i]][i]+=flow;
f[i][tt[i]]-=flow;
}
sol+=flow;
}
}
printf("%d\n",sol);
return 0;
}