Pagini recente » Cod sursa (job #2599553) | Cod sursa (job #3214700) | Cod sursa (job #3215167) | Cod sursa (job #3170276) | Cod sursa (job #2811422)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX = 1000;
int G[NMAX + 5][NMAX + 5], p[NMAX + 5];
vector <int> g[NMAX + 5];
bool vis[NMAX + 5];
int n, s, d;
inline bool bfs() {
queue <int> q; q.push(s); vis[s] = true;
while(!q.empty()) {
int top = q.front(); q.pop();
for(int adj : g[top])
if(!vis[adj] && G[top][adj]) {
p[adj] = top;
vis[adj] = true;
q.push(adj);
}
}
return vis[d];
}
void solve() {
for(int adj : g[d]) {
int minf = G[adj][d];
if(!minf) continue;
for(int node = adj; p[node]; node = p[node])
minf = min(minf, G[p[node]][node]);
G[adj][d] -= minf;
G[d][adj] += minf;
for(int node = adj; p[node]; node = p[node]) {
G[p[node]][node] -= minf;
G[node][p[node]] += minf;
}
}
}
int main()
{
int n, m, u, v, w;
fin >> n >> m;
s = 1, d = n;
for(int i = 1; i <= m; i++) {
fin >> u >> v >> w;
G[u][v] = w;
g[u].push_back(v);
g[v].push_back(u);
}
while(bfs()) {
solve();
memset(vis, 0, sizeof(vis));
memset(p, 0, sizeof(p));
}
int sol = 0;
for(int adj : g[s])
sol += G[adj][s];
fout << sol;
return 0;
}