Pagini recente » Cod sursa (job #743439) | Cod sursa (job #2637319) | Cod sursa (job #2503118) | Cod sursa (job #280110) | Cod sursa (job #1806895)
#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i = a; i <= b; i++)
#define ROF(i,a,b) for(int i = a; i >= b; i--)
#define REP(i,a) FOR(i,0,a-1)
#define pii pair<int,int>
#define pb push_back
#define mp make_pair
int n,m;
int flow[1001][1001];
int cap[1001][1001];
int T[1001];
bool seen[1001];
vector<int> G[1001];
bool bfs()
{
queue<int> Q;
fill_n(seen+1,n,0);
seen[1] = 1;
Q.push(1);
while (!Q.empty())
{
int u = Q.front();
Q.pop();
if (u == n) continue;
for (auto i: G[u])
{
if (seen[i] || flow[u][i] == cap[u][i]) continue;
T[i] = u;
Q.push(i);
seen[i] = 1;
}
}
if (seen[n]) return 1;
else return 0;
}
int MaxFlow()
{
int maxflow = 0;
while (bfs())
{
for (auto i: G[n])
{
if (!seen[i] || flow[i][n] == cap[i][n]) continue;
int minflow = (1LL<<31)-1;
T[n] = i;
for (int j = n; j != 1; j = T[j])
minflow = min(minflow,cap[T[j]][j]-flow[T[j]][j]);
if (!minflow) continue;
for (int j = n; j != 1; j = T[j])
{
flow[T[j]][j] += minflow;
flow[j][T[j]] -= minflow;
}
maxflow += minflow;
}
}
return maxflow;
}
int main()
{
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin >> n >> m;
REP(i,m) {
int x,y,z;
fin >> x >> y >> z;
cap[x][y] = z;
G[x].pb(y);
G[y].pb(x);
}
fout << MaxFlow() << "\n";
}