Mai intai trebuie sa te autentifici.
Cod sursa(job #1345695)
Utilizator | Data | 17 februarie 2015 20:11:36 | |
---|---|---|---|
Problema | Flux maxim | Scor | 0 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.78 kb |
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define nmax 1010
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int n, m, S, D, fMax, fMin;
int c[nmax][nmax], f[nmax][nmax], t[nmax];
bool viz[nmax];
vector <int> G[nmax];
queue <int> q;
void read() {
int x, y;
fin >> n >> m;
for (int i = 1; i <= m; i++) {
fin >> x >> y >> c[x][y];
G[x].push_back(y);
G[y].push_back(x);
}
}
bool bfs() {
for (int i = 0; i <= n; i++) viz[i] = false;
viz[1] = true;
q.push(1);
while (!q.empty()) {
int nod = q.front();
q.pop();
if (nod == n) continue;
for (int i = 0; i < G[nod].size(); i++) {
int vecin = G[nod][i];
if (viz[vecin] || c[nod][vecin] == f[nod][vecin]) continue;
viz[vecin] = true;
t[vecin] = nod;
q.push(vecin);
}
}
return viz[n];
}
void solve() {
for (fMax = 0; bfs(); ) {
for (int i = 0; i < G[n].size(); ++i) {
int vecin = G[n][i];
if (f[vecin][n] == c[vecin][n] || viz[vecin] == false) continue;
t[n] = vecin;
fMin = 0x3f3f;
for (int nod = n; nod != 1; nod = t[nod])
fMin = min(fMin, c[t[nod]][nod] - f[t[nod]][nod]);
if (fMin == 0) continue;
fMax += fMin;
for (int nod = n; nod != 1; nod = t[nod]) {
f[t[nod]][nod] += fMin;
}
}
}
fout << fMax << "\n";
}
int main() {
read();
solve();
fin.close();
fout.close();
return 0;
}