Pagini recente » Cod sursa (job #2023480) | Cod sursa (job #1272064) | Cod sursa (job #1859568) | Cod sursa (job #3219614) | Cod sursa (job #1371333)
#include <fstream>
#include <queue>
#define N 1001
#define M 5001
#define INF 2147483647
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n, m;
int c[N][N], f[N][N];
int vf[2 * M], urm[2 * M], lst[N], nvf = 0;
int t[N];
int flux = 0;
queue<int> q;
inline bool bf()
{
bool ok = 0;
for(int i = 1; i <= n; i++)
t[i] = 0;
t[1] = -1;
q.push(1);
while(!q.empty())
{
int x = q.front();
for(int i = lst[x]; i; i = urm[i])
{
int y = vf[i];
if(t[y] == 0 && c[x][y] > f[x][y])
{
if(y != n)
{
t[y] = x;
q.push(y);
}
else
ok = 1;
}
}
q.pop();
}
return ok;
}
inline void dinic()
{
for(bool drum = bf(); drum; drum = bf())
for(int i = lst[n]; i; i = urm[i])
{
int y = vf[i];
if(t[y] && c[y][n] > f[y][n])
{
t[n] = y;
int minim = INF;
for(int x = n; x != 1; x = t[x])
if(minim > c[t[x]][x] - f[t[x]][x])
minim = c[t[x]][x] - f[t[x]][x];
if(minim <= 0)
continue;
flux += minim;
for(int x = n; x != 1; x = t[x])
{
f[t[x]][x] += minim;
f[x][t[x]] -= minim;
}
}
}
}
int main()
{
in >> n >> m;
for(int i = 1; i <= m; i++)
{
int x, y;
in >> x >> y;
in >> c[x][y];
vf[++nvf] = y;
urm[nvf] = lst[x];
lst[x] = nvf;
vf[++nvf] = x;
urm[nvf] = lst[y];
lst[y] = nvf;
}
dinic();
out << flux << '\n';
return 0;
}