Pagini recente » Cod sursa (job #2721707) | Cod sursa (job #275573) | Cod sursa (job #1492219) | Cod sursa (job #2063022) | Cod sursa (job #2962636)
#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1000;
int cost[NMAX + 5][NMAX + 5];
bool viz[NMAX + 5];
int BFS(int node, int n, int &ans, vector<vector<int>> &G, int maxFlow) {
if(node == n) {
ans += maxFlow;
return maxFlow;
}
viz[node] = 1;
int totalFlow = 0;
for(auto &adj : G[node]) {
if(maxFlow == 0)
return totalFlow;
if(viz[adj] || !cost[node][adj])
continue;
int currFlow = BFS(adj, n, ans, G, min(maxFlow, cost[node][adj]));
cost[node][adj] -= currFlow;
cost[adj][node] += currFlow;
totalFlow += currFlow;
maxFlow = maxFlow - currFlow;
}
return totalFlow;
}
void DFS(int node, vector<vector<int>> &G) {
viz[node] = 1;
for(auto &adj : G[node])
if(cost[node][adj] && !viz[node])
DFS(adj, G);
}
int main()
{
//ios::sync_with_stdio(false);
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
fin.tie(0);
fout.tie(0);
int n, m;
fin >> n >> m;
vector<vector<int>> G(n + 1, vector<int>());
for(int i = 1; i <= m; i++) {
int a, b, c;
fin >> a >> b >> c;
G[a].push_back(b);
G[b].push_back(a);
cost[a][b] = c;
}
int ans = 0;
while(BFS(1, n, ans, G, 1e9)) {
for(int i = 1; i <= n; i++)
viz[i] = 0;
}
/* for(int i = 1; i <= n; i++)
viz[i] = 0;
DFS(1, G);
for(int i = 1; i <= n; i++)
if(viz[i])
for(auto &adj: G[i])
if(!viz[adj])
cout << i << " - " << adj << '\n';*/
fout << ans;
fin.close();
fout.close();
return 0;
}