Pagini recente » Cod sursa (job #428967) | Cod sursa (job #2575432) | Cod sursa (job #2947869) | Cod sursa (job #2337784) | Cod sursa (job #1674306)
#include <fstream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <stack>
#include <iomanip>
#define NMax 1001
#define INF 0x3f3f3f3f
using namespace std;
ifstream w("maxflow.in");
ofstream g("maxflow.out");
int viz[NMax],tata[NMax];
int c[NMax][NMax],f[NMax][NMax];
queue<int> q;
vector<int> G[NMax];
int x,y,r,n,m,F,fm,nod;
bool bfs(){
memset(viz,0,sizeof(viz));
q.push(1);
viz[1] = 1;
tata[1] = 0;
while(!q.empty()){
int nod = q.front();
q.pop();
for(int i = 0; i < G[nod].size(); ++i){
if(f[nod][G[nod][i]] != c[nod][G[nod][i]] && !viz[G[nod][i]]){
viz[G[nod][i]] = 1;
q.push(G[nod][i]);
tata[G[nod][i]] = nod;
}
}
}
if(viz[n] == 0)
return 0;
return 1;
}
int main()
{
// g << 1.0*(sizeof(c) + sizeof(f))/1024/1024 << '\n';
w >> n >> m;
for(int i = 1; i <= m; ++i){
w >> x >> y >> r;
c[x][y] += r;
G[x].push_back(y);
G[y].push_back(x);
}
F = 0;
while(bfs()){
fm = INF;
nod = n;
while(nod != 1){
fm = min(fm,c[tata[nod]][nod] - f[tata[nod]][nod]);
nod = tata[nod];
}
nod = n;
while(nod != 1){
f[nod][tata[nod]] -= fm;
f[tata[nod]][nod] += fm;
nod = tata[nod];
}
F += fm;
}
g << F;
return 0;
}