Pagini recente » Cod sursa (job #2605376) | Cod sursa (job #2413592) | Cod sursa (job #2726991) | Cod sursa (job #2616422) | Cod sursa (job #2947516)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int nmax = 1005;
int flux[nmax][nmax], fluxmaxim[nmax][nmax];
vector <int> edge[nmax];
int viz[nmax], parent[nmax];
bool bfs(int n)
{
int i;
for(i = 1; i <= n; i++)
viz[i] = 0;
viz[1] = 1;
queue <int> q;
q.push(1);
while(!q.empty()){
int nod = q.front();
q.pop();
if(nod == n)
continue;
for(i = 0; i < edge[nod].size(); i++){
int newnode = edge[nod][i];
if(flux[nod][newnode] == fluxmaxim[nod][newnode] or viz[newnode])
continue;
parent[newnode] = nod;
viz[newnode] = 1;
q.push(newnode);
}
}
return viz[n];
}
int main()
{
int n, i, j, m;
cin >> n >> m;
for(i = 1; i <= m; i++){
int x, y, z;
cin >> x >> y >> z;
fluxmaxim[x][y] += z;
edge[x].push_back(y);
edge[y].push_back(x);
}
int ans = 0;
while(bfs(n)){
for(i = 0; i < edge[n].size(); i++){
int nod = edge[n][i];
if(fluxmaxim[nod][n] == flux[nod][n] or !viz[nod])
continue;
parent[n] = nod;
int min_flux = 1e9 + 5;
for(j = n; j != 1; j = parent[j])
min_flux = min(min_flux, fluxmaxim[parent[j]][j] - flux[parent[j]][j]);
if(min_flux == 0)
continue;
for(j = n; j != 1; j = parent[j]){
flux[parent[j]][j] += min_flux;
flux[j][parent[j]] -= min_flux;
}
ans += min_flux;
}
}
cout << ans;
return 0;
}