Pagini recente » Cod sursa (job #550072) | Cod sursa (job #962296) | Cod sursa (job #2553064) | Cod sursa (job #1628356) | Cod sursa (job #1826418)
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
const int N = 1002;
int n,m,x,y,z,F[N][N],C[N][N],BF(),flow_now,max_flow,dad[N],i,j;
bitset<N> viz;
vector<int> v[N];
queue<int>Q;
int main()
{
f>>n>>m;
for(;m;m--)
{
f>>x>>y>>z;
C[x][y]=z;
v[x].push_back(y);
v[y].push_back(x);
}
while(BF())
{
for(i=1;i<=n;i++)
if(viz[i]&&C[i][n]-F[i][n])
{
flow_now=C[i][n]-F[i][n];
dad[n]=i;
for(j=n;j>1&&flow_now;j=dad[j])
flow_now=min(flow_now,C[dad[j]][j]-F[dad[j]][j]);
if(flow_now)
{
max_flow+=flow_now;
for(j=n;j>1;j=dad[j])
F[dad[j]][j]+=flow_now,F[j][dad[j]]-=flow_now;
}
}
}
g<<max_flow;
return 0;
}
int BF()
{
viz.reset();
Q.push(1);
viz[1]=1;
while(Q.size())
{
int nod=Q.front();
Q.pop();
for(auto vec: v[nod])
if(!viz[vec]&&C[nod][vec]-F[nod][vec])
{
viz[vec]=1;
dad[vec]=nod;
Q.push(vec);
}
}
return viz[n];
}