Pagini recente » Borderou de evaluare (job #2014760) | Cod sursa (job #2104402) | Cod sursa (job #568644) | Cod sursa (job #2081402) | Cod sursa (job #991110)
Cod sursa(job #991110)
#include <fstream>
#include <cstring>
#include <vector>
#define vint vector<int>::iterator
#define inf 1<<30
#define maxn 1001
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
vector<int> G[maxn];
int q[maxn],F[maxn][maxn],C[maxn][maxn],T[maxn];
bool viz[maxn];
int n,m,a,b,c,flow;
bool BFS ()
{
int l=1;
q[l]=1;
memset (viz,0,n+1);
viz[1]=1;
for (int s=1; s<=l; ++s)
{
if (q[s]==n) continue;
int node = q[s];
for (vint it = G[node].begin(); it!=G[node].end(); ++it)
{
if (C[node][*it]-F[node][*it] == 0 || viz[*it]) continue;
viz[*it] = 1;
q[++l] = *it;
T[*it] = node;
}
}
return viz[n];
}
int main()
{
fin>>n>>m;
for (int i=1; i<=m; ++i)
{
fin>>a>>b>>c;
C[a][b] = c;
G[a].push_back(b);
G[b].push_back(a);
}
while (BFS())
{
for (vint it = G[n].begin(); it!=G[n].end(); ++it)
{
if (!viz[*it] || C[*it][n]-F[*it][n] ==0) continue;
T[n] = *it;
int minf=inf;
for (int i = n; i!=1; i=T[i])
minf = min(minf,C[T[i]][i] - F[T[i]][i]);
if (minf==0) continue;
for (int i = n; i!=1; i=T[i])
{
F[T[i]][i] += minf;
F[i][T[i]] -= minf;
}
flow+=minf;
}
}
fout<<flow;
}