Pagini recente » Cod sursa (job #1363710) | Cod sursa (job #820511) | Cod sursa (job #1804862) | Cod sursa (job #1838078) | Cod sursa (job #1829833)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
const int NMAX = 1005;
const int Min_Val = 0x3f3f3f3f;
int n, m, cap[NMAX + 5][NMAX + 5], parent[NMAX + 5], viz[NMAX + 5];
vector<int> G[NMAX + 5];
bool BFS(){
int i, node, nxt_node;
memset(viz, 0, sizeof viz);
queue<int>q;
q.push(1);
viz[1] = true;
while(!q.empty()){
node = q.front();
q.pop();
if(node != n){
for(i = 0; i < (int)G[node].size(); ++i){
nxt_node = G[node][i];
if(!viz[nxt_node] && cap[node][nxt_node]){
q.push(nxt_node);
parent[nxt_node] = node;
viz[nxt_node] = true;
}
}
}
}
return viz[n];
}
int main()
{
int i, x, y, c, flow = 0, flowmin = Min_Val, curr_node, j;
fin>>n>>m;
for(i = 1; i <= m; ++i){
fin>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
cap[x][y] = c;
}
while(BFS()){
for(j = 0; j < (int)G[n].size(); ++j){
curr_node = G[n][j];
if(viz[curr_node] && cap[curr_node][n]){
parent[n] = curr_node;
flowmin = Min_Val;
for(i = n; i != 1; i = parent[i]){
flowmin = min(flowmin, cap[parent[i]][i]);
}
for(i = n; i != 1; i = parent[i]){
cap[parent[i]][i] -= flowmin;
cap[i][parent[i]] += flowmin;
}
flow += flowmin;
}
}
}
fout<<flow;
return 0;
}