Pagini recente » Cod sursa (job #2364918) | Cod sursa (job #1882583) | Cod sursa (job #1434085) | Cod sursa (job #1719167) | Cod sursa (job #3155963)
#include <bits/stdc++.h>
using namespace std;
#define int long long
ifstream in("maxflow.in");
ofstream out("maxflow.out");
struct Flux
{
vector<vector<int>>cap;
vector<vector<int>>g;
vector<int>t;
vector<int>dist;
int n;
int inf = 1e9;
Flux(int N)
{
n = N;
g.resize(n + 1);
t.resize(n + 1);
dist.resize(n + 1);
cap.resize(n + 1);
for (int i = 1; i <= n; i++)
cap[i].resize(n + 1);
}
void Baga(int x,int y,int c)
{
g[x].push_back(y);
g[y].push_back(x);
cap[x][y] = c;
}
bool Bfs(int s,int d)
{
dist.assign(n + 1,inf);
t.assign(n + 1,0);
queue<int>q;
q.push(s);
dist[s] = 0;
while (!q.empty())
{
int nod = q.front();
q.pop();
for (auto vecin : g[nod])
{
if (dist[vecin] > 1 + dist[nod] and cap[nod][vecin] != 0 and vecin != d)
{
dist[vecin] = 1 + dist[nod];
q.push(vecin);
t[vecin] = nod;
}
else if (vecin == d and cap[nod][vecin] != 0)
return true;
}
}
return false;
}
int MaxFlow(int s,int d)
{
int ans = 0;
int iter = 0;
while (Bfs(s,d) == true)
{
/*iter++;
if (iter <= 5)
{
for (int i = 1; i <= n; i++)
cout << t[i] << ' ';
cout << endl;
}*/
for (auto vecin : g[d])
{
if (dist[vecin] < inf and cap[vecin][d] != 0)
{
int nod = d,flux = inf;
t[d] = vecin;
while (nod != s)
{
flux = min(flux,cap[t[nod]][nod]);
nod = t[nod];
}
ans += flux;
//cout << ans << endl;
nod = d;
while (nod != s)
{
cap[t[nod]][nod] -= flux;
cap[nod][t[nod]] += flux;
nod = t[nod];
}
}
}
}
return ans;
}
};
signed main()
{
int n, m;
in >> n >> m;
Flux g(n);
for(int i = 0; i < m; i++)
{
int x,y,c;
in >> x >> y >> c;
g.Baga(x,y,c);
}
out << g.MaxFlow(1, n);
}