Pagini recente » Cod sursa (job #1649410) | Cod sursa (job #2192120) | Cod sursa (job #1193579) | Cod sursa (job #289729) | Cod sursa (job #2135681)
#include <bits/stdc++.h>
using namespace std;
int n, m, c[1005][1005], f[1005][1005], p[1005];
bool ok[1005];
vector<int> v[1005];
bool bfs()
{
queue<int> q;
memset(ok, 0, sizeof(ok));
q.push(1);
ok[1] = 1;
bool finish = false;
while(!q.empty()){
int k = q.front();
q.pop();
for (vector<int>::iterator it = v[k].begin(); it != v[k].end(); ++it)
if(!ok[*it] && c[k][*it] != f[k][*it]){
ok[*it] = 1;
p[*it] = k;
q.push(*it);
if(*it == n)
finish = 1;
}
}
return finish;
}
int main()
{
ifstream fin ("maxflow.in");
ofstream fout ("maxflow.out");
fin >> n >> m;
while(m--){
int x, y, C;
fin >> x >> y >> C;
v[x].push_back(y);
v[y].push_back(x);
c[x][y] = C;
}
int flow = 0;
while(bfs())
for (vector<int>::iterator it = v[n].begin(); it != v[n].end(); ++it)
if(ok[*it] && f[*it][n] != c[*it][n]){
p[n] = *it;
int nod = n, mn = 2000000000;
while(nod != 1){
mn = min(mn, c[p[nod]][nod]-f[p[nod]][nod]);
nod = p[nod];
}
if(mn == 0)
continue;
nod = n;
while(nod != 1){
f[p[nod]][nod] += mn;
f[nod][p[nod]] -= mn;
nod = p[nod];
}
flow += mn;
}
fout << flow << "\n";
return 0;
}