Pagini recente » Cod sursa (job #1981049) | Cod sursa (job #681140) | Cod sursa (job #1780435) | Cod sursa (job #1134729) | Cod sursa (job #1262740)
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
long N, M;
long cap[1001][1001];
vector<long> ad[1001]; // adiacente
long a, b, c;
long viz[1001]; // contine de unde vine
long rez, minc;
queue<long> q, m;
bool bfs() {
long i, j, crt;
q.push(1);
m.push(111000);
while(!q.empty()) {
crt = q.front();
if(crt == N) {
rez += m.front();
minc = m.front();
while(!q.empty()) {
q.pop();
m.pop();
}
return true;
}
for(i = 0; i < ad[crt].size(); i++)
if(cap[crt][ad[crt][i]] > 0 && !viz[ad[crt][i]]) {
if(m.front() > cap[crt][ad[crt][i]])
m.push(cap[crt][ad[crt][i]]);
else m.push(m.front());
q.push(ad[crt][i]);
viz[ad[crt][i]] = crt;
}
q.pop();
m.pop();
}
return false;
}
int main() {
long i, j;
freopen("maxflow.in", "r", stdin);
freopen("maxflow.out", "w", stdout);
scanf("%ld %ld", &N, &M);
for(i = 1; i <= M; i++) {
scanf("%ld %ld %ld", &a, &b, &c);
cap[a][b] = c;
ad[a].push_back(b);
ad[b].push_back(a);
}
while(bfs()) {
long i;
i = N;
while(i != 1) {
cap[i][viz[i]] += minc;
cap[viz[i]][i] -= minc;
i = viz[i];
}
memset(viz, 0, sizeof(viz));
}
printf("%ld\n", rez);
return 0;
}