Pagini recente » Cod sursa (job #587757) | Cod sursa (job #206685) | Clasament moisil_11-12_sim | Cod sursa (job #1296961) | Cod sursa (job #2208296)
#include <fstream>
#include <vector>
using namespace std;
#define NMAX 1000
#define infinit 2000000000
ifstream f("maxflow.in");
ofstream g("maxflow.out");
vector<int> A[NMAX];
int C[NMAX][NMAX],F[NMAX][NMAX],T[NMAX];
int n,m;
bool ameliorare(int sursa, int destinatie){
int Q[n+1];
int q = 1;
bool vizitat[n+1];
for(int i=1; i<=n; i++) vizitat[i] = false;
for(int i=1; i<=n; i++) T[i] = 0;
Q[0] = sursa;
vizitat[sursa] = true;
for(int i=0;i<q;i++){
int nod = Q[i];
for(unsigned int j = 0; j < A[nod].size(); j++){
int vecin = A[nod][j];
if(!vizitat[vecin] && C[nod][vecin] - F[nod][vecin] > 0){
Q[q++] = vecin;
T[vecin] = nod;
vizitat[vecin] = true;
}
}
}
if (vizitat[destinatie]) return true;
return false;
}
int main()
{
int flux = 0;
f >> n >> m;
int sursa = 1, destinatie = n;
for(int i=0; i<m; i++){
int nod1, nod2, cost;
f >> nod1 >> nod2 >> cost;
C[nod1][nod2] = cost;
A[nod1].push_back(nod2);
}
while(ameliorare(sursa,destinatie)){
int saturare = infinit;
for(int nod = destinatie; nod != sursa; nod = T[nod])
if (saturare > C[T[nod]][nod] - F[T[nod]][nod])
saturare = C[T[nod]][nod] - F[T[nod]][nod];
for(int nod = destinatie; nod != sursa; nod = T[nod])
F[T[nod]][nod] += saturare;
flux += saturare;
}
g << flux;
return 0;
}