Pagini recente » Cod sursa (job #466122) | Cod sursa (job #3217017)
#include <fstream>
#include <queue>
#include <stack>
#include <vector>
#include <algorithm>
#include <iomanip>
#define ll long long
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int NMAX = 1000;
const int INF = 1e9;
int n, m, addflow, maxflow;
bool reachable;
vector<int> G[NMAX + 1];
int capacity[NMAX + 1][NMAX + 1];
int parent[NMAX + 1];
int BFS()
{
for(int i = 1; i <= n; i++)
parent[i] = 0;
parent[1] = -1;
queue<int> Q;
Q.push(1);
while(!Q.empty())
{
int node = Q.front();
Q.pop();
for(int nextNode : G[node])
if(!parent[nextNode] && capacity[node][nextNode])
{
parent[nextNode] = node;
Q.push(nextNode);
}
}
return parent[n];
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
int a, b, c;
cin >> a >> b >> c;
capacity[a][b] += c;
G[a].push_back(b);
G[b].push_back(a);
}
reachable = BFS();
while(reachable)
{
for(int endNode : G[n])
if(capacity[endNode][n] && parent[n])
{
int addflow = INF;
int cur = n;
parent[n] = endNode;
while(cur != 1)
{
int previ = parent[cur];
addflow = min(addflow, capacity[previ][cur]);
cur = previ;
}
if(addflow > 0)
{
maxflow += addflow;
cur = n;
while(cur != 1)
{
int previ = parent[cur];
capacity[previ][cur] -= addflow;
capacity[cur][previ] += addflow;
cur = previ;
}
}
}
reachable = BFS();
}
cout << maxflow;
return 0;
}