Pagini recente » Cod sursa (job #3296025) | Cod sursa (job #3194078) | Solutii preONI 2007, Runda 2 | Cod sursa (job #2063993) | Cod sursa (job #757671)
Cod sursa(job #757671)
#include <queue>
#include <vector>
#include <fstream>
#include <cstdlib>
using namespace std;
const int oo=1<<29;
const int N_MAX=1011;
queue<int> Q;
vector<int> G[N_MAX];
vector<int>::const_iterator it, iend;
int C[N_MAX][N_MAX], F[N_MAX][N_MAX];
int f[N_MAX];
inline int _min(int x, int y) {return x <= y? x : y;}
bool findPath(int start, int N)
{
int x;
fill(f+1, f+N+1, -1);
f[start]=-2;
for(Q.push(start); !Q.empty(); Q.pop())
{
x=Q.front();
if(x == N)
continue;
for(it=G[x].begin(), iend=G[x].end(); it < iend; ++it)
if(-1 == f[*it] && C[x][*it] > F[x][*it])
{
f[*it]=x;
Q.push(*it);
}
}
return -1 != f[N];
}
int main()
{
int N, M, x, y, cMin, s=0;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
for(in>>N>>M; M; --M)
{
in>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
in>>C[x][y];
}
while(findPath(1, N))
{
for(it=G[N].begin(), iend=G[N].end(); it < iend; ++it)
if(-1 != f[*it] && C[*it][N] > F[*it][N])
{
f[N]=*it;
cMin=oo;
for(x=N; -2 != f[x]; x=f[x])
cMin=_min(cMin, C[f[x]][x] - F[f[x]][x]);
for(x=N; -2 != f[x]; x=f[x])
{
F[f[x]][x]+=cMin;
F[x][f[x]]-=cMin;
}
s+=cMin;
}
}
out<<s<<'\n';
return EXIT_SUCCESS;
}