Pagini recente » Cod sursa (job #3213862) | Cod sursa (job #2414706) | Cod sursa (job #511620) | Cod sursa (job #904328) | Cod sursa (job #859010)
Cod sursa(job #859010)
#include<fstream>
#include<vector>
#include<cstring>
#include<queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
#define NMAX (1<<10)
#define make_pair mp
#define pb push_back
int TT[NMAX], F[NMAX][NMAX], C[NMAX][NMAX];
int N, M, flow;
queue<int> q;
vector <int> G[NMAX];
vector<int>::iterator it;
bool viz[NMAX];
void Read() {
fin >>N >>M;
for(int i = 1; i <= M; ++i) {
int x, y, cost;
fin >>x >> y>> cost;
C[x][y] = cost;
G[x].pb(y);
G[y].pb(x);
}
}
bool BFS() {
for(int i = 0 ;i <= N; i++) viz[i] = false;
q.push(1);
viz[1] = true;
while(!q.empty()) {
int nod = q.front();
q.pop();
if(nod == N) continue;
for(it = G[nod].begin() ; it != G[nod].end(); it++) {
if(viz[*it] == true) continue;
if(F[nod][*it] < C[nod][*it] ) {
q.push(*it);
viz[*it] = true;
TT[*it] = nod;
}
}
}
return viz[N];
}
int Solve() {
for(flow = 0; BFS() ; ){
for(it = G[N].begin(); it != G[N].end(); ++it) {
if( viz[*it] == false ) continue;
if(F[*it][N] < C[*it][N]) {
int fmin = 1<<30;
TT[N] = *it;
for(int j = N; j != 1; j = TT[j] )
fmin = min(fmin, C[TT[j]][j] - F[TT[j]][j]);
if(fmin == 0) continue;
for(int j = N ; j != 1; j = TT[j]) {
F[TT[j]][j] += fmin;
F[j][TT[j]] -= fmin;
}
flow += fmin;
}
}
}
return flow;
}
int main() {
Read ();
fout << Solve ();
return 0;
}