Pagini recente » Cod sursa (job #2286943) | Cod sursa (job #1348189) | Cod sursa (job #1821870) | Cod sursa (job #1027175) | Cod sursa (job #2937056)
#include<bits/stdc++.h>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n, m, ii, tt, i, x, y, c, flow[1005][1005], capacity[1005][1005], rez, dad[1005], curr, max_add_flow, level[1005];
vector <int> v[1005];
bool seen[1005];
bool BFS()
{
memset(seen, false, sizeof(seen));
seen[1] = true;
queue <int> Q;
Q.push(1);
while(!Q.empty())
{
int aux = Q.front();
Q.pop();
for(int i = 0; i < v[aux].size(); i ++)
{
int aux1 = v[aux][i];
if (level[aux1] == level[aux] + 1 && !seen[aux1] && flow[aux][aux1] < capacity[aux][aux1])
{
dad[aux1] = aux;
seen[aux1] = true;
Q.push(aux1);
if (aux1 == n)
return true;
}
}
}
return false;
}
void build_levels()
{
queue<int> Q;
Q.push(1);
level[1] = 1;
memset(seen, 0, sizeof(seen));
while(!Q.empty())
{
int aux = Q.front();
Q.pop();
for(int i = 0; i < v[aux].size(); i ++)
{
int aux1 = v[aux][i];
if (!seen[aux1] && capacity[aux][aux1] > 0 && flow[aux][aux1] < capacity[aux][aux1])
{
level[aux1] = level[aux] + 1;
seen[aux1] = true;
Q.push(aux1);
if (aux1 == n)
return;
}
}
}
}
void read()
{
f >> n >> m;
for(i = 1; i <= m; i ++)
{
f >> x >> y >> c;
v[x].push_back(y);
v[y].push_back(x);
capacity[x][y] = c;
}
}
void solve()
{
while(true)
{
build_levels();
bool flag = true;
while(BFS())
{
flag = false;
curr = n;
max_add_flow = 1e9;
while(curr != 1)
{
max_add_flow = min(max_add_flow, capacity[dad[curr]][curr] - flow[dad[curr]][curr]);
curr = dad[curr];
}
curr = n;
while(curr != 1)
{
flow[dad[curr]][curr] += max_add_flow;
flow[curr][dad[curr]] -= max_add_flow;
curr = dad[curr];
}
rez += max_add_flow;
}
if(flag)
break;
}
}
void write()
{
g << rez << "\n";
f.close();
g.close();
}
int main()
{
//cin >> tt;
tt = 1;
for(ii = 1; ii <= tt; ii ++)
{
read();
solve();
write();
}
return 0;
}