Pagini recente » Cod sursa (job #664104) | Cod sursa (job #1633248) | Cod sursa (job #2428860) | Cod sursa (job #1580712) | Cod sursa (job #544512)
Cod sursa(job #544512)
#include <cstdio>
#include <deque>
#define N 1003
using namespace std;
int flow[N][N],dist[N],edges[N][N],n,ok[N];
deque <int> que;
int do_df(int node, int cap) {
if (cap == 0)
return 0;
if (node == n-1)
return cap;
ok[node]=1;
int bag = 0;
for (int i = 1; i <= edges[node][0]; ++i)
{
const int next = edges[node][i];
if ((flow[node][next] == 0) || (ok[next]==1))
continue;
const int r = do_df(next, min(cap-bag, flow[node][next]));
if (r) {
flow[node][next] -= r;
flow[next][node] += r;
bag += r;
}
}
ok[node]=0;
return bag;
}
int main()
{
int i,m,a,b,c,now=1,sol=0;
freopen("maxflow.in","r",stdin);
freopen("maxflow.out","w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=m;++i)
{
scanf("%d %d %d",&a,&b,&c);
flow[a-1][b-1]=c;
}
while (now>0)
{
for (i=1;i<n;++i) dist[i]=0;
dist[0]=1;
que.push_back(0);
while (!que.empty())
{
int node = que.front();
que.pop_front();
if (node == n-1)
break;
for (int i = 0; i < n; ++i)
{
if (flow[node][i] == 0)
continue;
if (dist[i] == 0)
{
que.push_back(i);
dist[i] = dist[node]+1;
edges[node][++edges[node][0]] = i;
} else if (dist[i] == dist[node]+1)
{
edges[node][++edges[node][0]] = i;
}
}
}
ok[0]=1;
now=do_df(0,n-1);
sol+=now;
}
printf("%d",sol);
return 0;
}