Pagini recente » Cod sursa (job #2343408) | Cod sursa (job #2295393) | Cod sursa (job #2415292) | Cod sursa (job #2104659) | Cod sursa (job #1414502)
#include <iostream>
#include <vector>
#include <set>
#include <queue>
#include <algorithm>
#include <string>
#include <fstream>
#include <cctype>
#include <iomanip>
#include <cmath>
#include <cstring>
#include <map>
#include <bitset>
#include <stack>
#define INF 0x3f3f3f
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int> V[1001];
bitset<1001> used;
int c[1001][1001], f[1001][1001];
int t[1001];
//stack<int> ST;
int flow;
queue<int> Q;
int n;
int delta;
bool BFS()
{
used.reset();
Q.push(1);
used[1] = true;
while(!Q.empty())
{
int node = Q.front();
Q.pop();
for(vector<int>::iterator it = V[node].begin(); it != V[node].end() && node != n; it++)
if(!used[*it] && c[node][*it] > f[node][*it])
{
t[*it] = node;
Q.push(*it);
used[*it] = true;
}
}
return used[n];
}
void doFlow()
{
delta = INF;
int node = n;
while(t[node])
{
delta = min(delta, c[t[node]][node] - f[t[node]][node]);
node = t[node];
}
if(!delta)
return;
node = n;
while(t[node])
{
f[node][t[node]] -= delta;
f[t[node]][node] += delta;
node = t[node];
}
flow += delta;
}
int main()
{
int m,x,y;
fin>>n>>m;
for(int i = 1; i <= m; i++)
{
fin>>x>>y;
V[x].push_back(y);
V[y].push_back(x);
fin>>c[x][y];
}
while(BFS())
{
for(vector<int>::iterator it = V[n].begin(); it != V[n].end(); it++)
{
t[n] = *it;
if(used[*it] && c[*it][n] > f[*it][n])
doFlow();
}
}
fout<<flow;
return 0;
}
//FILE!!!