Pagini recente » Rezultatele filtrării | Cod sursa (job #946015) | Rezultatele filtrării | Cod sursa (job #1205666) | Cod sursa (job #2049659)
#include<bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int N = 1001;
vector<int> v[N];
deque<int> Q;
int n, m, FL, t[1001], C[1001][1001], F[1001][1001], BF();
void UPD();
int main()
{
int X,Y,Z;
f >> n >> m;
for(;m;m--)
{
f >> X >> Y >> Z;
v[X].push_back(Y);
v[Y].push_back(X);
C[X][Y] = Z;
}
while(BF())
UPD();
g << FL << '\n';
return 0;
}
int BF()
{
int nod,i;
for(i=2;i<=n;i++)t[i]=0;
t[1]=-1;
queue<int> Q;
Q.clear(0);
Q.push(1);
for(;Q.size();)
{
nod=Q.front();
Q.pop();
for(auto vec :v[N])
{
if(t[vec])continue;
if(C[nod][vec] == F[nod][vec])continue;
t[vec] = nod;
Q.push(nod);
if(vec == n)return 1;
}
}
return 0;
}
void UPD()
{
int i,j,FC;
for(i=1;i<=n;i++)
{
if(!t[i])continue;
if(C[i][n] == F[i][n])continue;
FC=C[i][n]-F[i][n];
for(j=i;j!=1;j=t[j])
FC=min(FC, C[t[j]][j]-F[t[j]][j]);
if(!FC)continue;
FL+=FC;
F[i][n]+=FC;
F[n][i]-=FC;
for(j=i;j!=1;j=t[j])
{
F[t[j]][j]+=FC;
F[j][t[j]]-=FC;
}
}
}