Pagini recente » Cod sursa (job #1923003) | Cod sursa (job #151641) | Istoria paginii planificare/sedinta-20081107 | Cod sursa (job #2267528) | Cod sursa (job #751373)
Cod sursa(job #751373)
#include <queue>
#include <vector>
#include <fstream>
#include <cstdlib>
using namespace std;
const int N_MAX=1011;
const int oo=1<<29;
queue<int> Q;
vector<int> G[N_MAX];
vector<int>::const_iterator it, iend;
int F[N_MAX][N_MAX], C[N_MAX][N_MAX], f[N_MAX];
bool BFS(const int& N)
{
int x;
fill(f+1, f+N+1, 0);
f[1]=-1;
for(Q.push(1); !Q.empty(); )
{
x=Q.front(); Q.pop();
if(N == x)
continue;
for(it=G[x].begin(), iend=G[x].end(); it < iend; ++it)
{
if(0 == f[*it] && F[x][*it] < C[x][*it])
{
f[*it]=x;
Q.push(*it);
}
}
}
return 0 != f[N];
}
inline int _min(int x, int y) {return x <= y ? x : y;}
int main()
{
int N, M, x, y, c, cMin, i, s;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
for(in>>N>>M; M; --M)
{
in>>x>>y>>c;
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=c;
}
for(s=0; BFS(N); )
{
for(it=G[N].begin(), iend=G[N].end(); it < iend; ++it)
if(0 != f[*it] && C[*it][N] > F[*it][N])
{
f[N]=*it;
cMin=oo;
for(i=N; -1 != f[i]; i=f[i])
cMin=_min(cMin, C[f[i]][i]-F[f[i]][i]);
for(i=N; -1 != f[i]; i=f[i])
{
F[i][f[i]]-=cMin;
F[f[i]][i]+=cMin;
}
s+=cMin;
}
}
out<<s<<"\n";
return EXIT_SUCCESS;
}