Pagini recente » Cod sursa (job #741911) | Cod sursa (job #399341) | Cod sursa (job #2898432) | Cod sursa (job #2601364) | Cod sursa (job #1641235)
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1001
#define inf 2000000000
using namespace std;
int U[NMAX], F[NMAX][NMAX], C[NMAX][NMAX], T[NMAX], n, m;
queue<int> Q;
vector<int> G[NMAX];
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int BFS()
{ Q.push(1);
int i, ok=0;
for (i=1; i<=n; ++i)
U[i]=0;
while (!Q.empty())
{ int nod=Q.front(), k;
Q.pop();
for (i=0; i<G[nod].size(); ++i)
{ k=G[nod][i];
if (k!=n && !U[k] && C[nod][k]!=F[nod][k])
{ Q.push(k);
U[k]=1;
T[k]=nod;
ok=1;
}
}
}
return ok;
}
int main()
{ int i, nod, mini, cap, x, y;
f>>n>>m;
for (; m; --m)
{ f>>x>>y>>cap;
C[x][y]=cap;
G[x].push_back(y);
G[y].push_back(x);
}
int flux;
for (flux=0; BFS(); )
for (i=0; i<G[n].size(); ++i)
{ mini=inf;
nod=G[n][i];
while (T[nod])
{ mini=min(mini, C[T[nod]][nod]-F[T[nod]][nod]);
nod=T[nod];
}
flux+=mini;
nod=G[n][i];
while (T[nod])
{ F[T[nod]][nod]+=mini;
F[nod][T[nod]]-=mini;
nod=T[nod];
}
}
g<<flux;
return 0;
}