Pagini recente » Cod sursa (job #1378268) | Cod sursa (job #1016109) | Cod sursa (job #56788) | Cod sursa (job #2748699) | Cod sursa (job #2122471)
#include<bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int N = 1001;
vector<int> v[N];
queue<int> Q;
int n , m , FL, t[1001], C[1001][1001], F[1001][1001];
int BF()
{
int i,nod,vec;
memset(t,0,sizeof(t));
t[1]=-1;
queue<int> Q;
Q.push(1);
while(!Q.empty())
{
nod=Q.front(); Q.pop();
for(i=0;i<v[nod].size();i++)
{ vec=v[nod][i];
if(t[vec] || C[nod][vec]==F[nod][vec])continue;
t[vec]=nod;
Q.push(vec);
if(vec==n)return 1;
}
}
return 0;
}
void dinic()
{
int i,j,FC;
while(BF())
for(i=1;i<=n;i++)
{
if(!t[i] || 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;
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;
}
FL+=FC;
}
}
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;
}
dinic();
g<<FL<<'\n';
return 0;
}