Pagini recente » Cod sursa (job #1967269) | Cod sursa (job #1782412) | Borderou de evaluare (job #2188565) | Borderou de evaluare (job #2685880) | Cod sursa (job #2971800)
/// Dinic's algorithm - Solutie de 100 de puncte, Complexitate: O(m * n * n) m - Nr. de muchii, n - Nr. de noduri
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define pf push_front
#define MOD 1000000007
#define MAX 1005
using namespace std;
map < pair < int, int >, int > h;
vector < int > v[MAX];
int n, nvl[MAX];
bool dead_end[MAX];
void nivelare(int nod);
int dfs(int nod, int minn);
int main()
{
ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
int m, i, x, y, z, r = 0;
cin >> n >> m;
for(i = 1; i <= m; i++)
{
cin >> x >> y >> z;
v[x].pb(y), h[{x, y}] = z;
if(h[{y, x}] == 0) v[y].pb(x);
}
nivelare(1);
while(nvl[n] != 0)
{
x = 1;
while(x != 0)
{
x = dfs(1, INT_MAX);
r += x;
}
nivelare(1);
}
cout << r;
return 0;
}
void nivelare(int nod)
{
queue < int > q;
for(int i = 1; i <= n; i++) nvl[i] = 0, dead_end[i] = 0;
nvl[nod] = 1, q.push(nod);
while(q.empty() == 0)
{
nod = q.front(), q.pop();
for(int it:v[nod]) if(nvl[it] == 0 && h[{nod,it}] > 0)
{
nvl[it] = nvl[nod] + 1;
q.push(it);
}
}
}
int dfs(int nod, int minn)
{
if(nod == n) return minn;
for(int it:v[nod]) if(nvl[it] == nvl[nod] + 1 && dead_end[it] == 0 && h[{nod, it}] > 0)
{
int x = dfs(it, min(minn, h[{nod, it}]));
if(x > 0)
{
h[{nod, it}] -= x;
h[{it, nod}] += x;
return x;
}
else dead_end[it] = 1;
}
return 0;
}