Pagini recente » Cod sursa (job #604551) | Cod sursa (job #2072930) | Cod sursa (job #1606752) | Cod sursa (job #2622780) | Cod sursa (job #2805092)
#include <bits/stdc++.h>
#define inf 1e9
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int nmax = 1e3 + 5;
int n, m;
bool vis[nmax];
int c[nmax][nmax], f[nmax][nmax], tt[nmax];
vector <int> v[nmax];
void read(){
fin >> n >> m;
for(int i = 1; i <= m; i++){
int x, y, z;
fin >> x >> y >> z;
c[x][y] += z;
v[x].push_back(y);
v[y].push_back(x);
}
}
bool bfs(){
vector <int> q;
memset(vis, 0, sizeof(vis));
q.push_back(1);
vis[1] = true;
for(int i = 0; i < q.size(); i++){
int node = q[i];
if(node == n)
continue;
for(int j = 0; j < v[node].size(); j++){
int ngh = v[node][j];
if(c[node][ngh] == f[node][ngh] || vis[ngh])
continue;
vis[ngh] = true;
q.push_back(ngh);
tt[ngh] = node;
}
}
return vis[n];
}
void solve(){
int flow = 0, flowMin;
while(bfs())
for(int i = 0; i < v[n].size(); i++){
int node = v[n][i];
if(f[node][n] == c[node][n] || !vis[node])
continue;
tt[n] = node;
flowMin = inf;
for(node = n; node != 1; node = tt[node])
flowMin = min(flowMin, c[tt[node]][node] - f[tt[node]][node]);
if(flowMin == 0)
continue;
for(node = n; node != 1; node = tt[node]){
f[tt[node]][node] += flowMin;
f[node][tt[node]] -= flowMin;
}
flow += flowMin;
}
fout << flow;
}
int main()
{
read();
solve();
return 0;
}