Pagini recente » Cod sursa (job #1392920) | Cod sursa (job #154551) | Cod sursa (job #154320) | Cod sursa (job #1145630) | Cod sursa (job #2122364)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int N = 1003, M = 1999999999;
int cap[N][N], fl[N][N];
short int c[N], pred[N], n;
bool viz[N];
vector <short int> v[N];
bool BFS(int ns, int sink){
int st = 1, dr = 1, nod, sz, nbr;
viz[ns] = true;
c[1] = ns;
for(int i=1;i<=n;i++)
viz[i] = false;
while(st <= dr){
nod = c[st++];
if(nod == sink)
continue;
sz = v[nod].size();
for(int i=0;i<sz;i++){
nbr = v[nod][i];
if(cap[nod][nbr] == fl[nod][nbr] || viz[nbr] == true)
continue;
viz[nbr] = true;
c[++dr] = nbr;
pred[nbr] = nod;
}
}
return viz[sink];
}
int main()
{
int m,x,y,z, flow = 0, ns = 1, sink, nod, crt, sz;
in>>n>>m;
sink = n;
for(int i=1;i<=m;i++){
in>>x>>y>>z;
v[x].push_back(y);
v[y].push_back(x);
cap[x][y] = z;
}
in.close();
while(BFS(ns,sink) == true){
sz = v[sink].size();
for(int i=0;i<sz;i++){
nod = v[sink][i];
if(cap[nod][sink] == fl[nod][sink] || viz[nod] == false)
continue;
pred[sink] = nod;
crt = M;
nod = sink;
while(nod != ns){
crt = min(crt, cap[pred[nod]][nod] - fl[pred[nod]][nod]);
nod = pred[nod];
}
if(crt == 0)
continue;
nod = sink;
while(nod != ns){
fl[pred[nod]][nod] += crt;
fl[nod][pred[nod]] -= crt;
nod = pred[nod];
}
flow += crt;
}
}
out<<flow<<"\n";
out.close();
return 0;
}