Pagini recente » Cod sursa (job #3148066) | Cod sursa (job #1630284) | Cod sursa (job #3286027) | Cod sursa (job #753319) | Cod sursa (job #2961790)
#include <fstream>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int residualGraph[1001][1001];
vector<int> tt;
vector<int> viz;
int n, m;
void reset(vector<int>& v)
{
for(int i = 1; i <= n; ++i)
{
v[i] = 0;
}
v[1] = 1;
}
bool bfs()
{
reset(tt);
queue<int> q;
q.push(1);
while(!q.empty())
{
int crt = q.front();
q.pop();
for(int j = 1; j <= n; ++j)
{
if(tt[j] == 0 && residualGraph[crt][j] > 0)
{
q.push(j);
tt[j] = crt;
if(j == n)
return true;
}
}
}
if(tt[n] != 0)
return true;
return false;
}
int getFlow()
{
int flow = 1000000000;
int i = n;
while(i != 1)
{
flow = min(flow, residualGraph[tt[i]][i]);
i = tt[i];
}
return flow;
}
void updateResidual(int flow)
{
int i = n;
while(i != 1)
{
residualGraph[i][tt[i]] += flow;
residualGraph[tt[i]][i] -= flow;
i = tt[i];
}
}
int main()
{
fin>>n>>m;
tt.resize(n + 1);
int x, y, z;
int res = 0;
for(int i = 0; i < m; ++i)
{
fin>>x>>y>>z;
residualGraph[x][y] = z;
residualGraph[y][x] = 0;
}
while(bfs())
{
int flow = getFlow();
res += flow;
updateResidual(flow);
}
fout<<res;
return 0;
}