Pagini recente » Cod sursa (job #1343035) | Cod sursa (job #979396) | Cod sursa (job #2536466) | Cod sursa (job #2774329) | Cod sursa (job #1164817)
#include <fstream>
#include <queue>
#include <cstring>
#include <vector>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
const int MAX_N = 1000, INF = 2000000000;
int f[MAX_N+1][MAX_N+1], pred[MAX_N+1], c[MAX_N+1][MAX_N+1];
int n, m;
bool viz[MAX_N+1];
queue<int> q;
int min2(int a, int b)
{
return (a < b) ? a : b;
}
bool bfs()
{
int i, s;
memset(viz+1, false, n);
q.push(1);
viz[1] = true;
while(!q.empty())
{
s = q.front();
q.pop();
if(s != n)
{
for(i = 1; i <= n ; i++)
{
if(!viz[i] && f[s][i] < c[s][i])
{
viz[i] = true;
q.push(i);
pred[i] = s;
}
}
} else {
while(!q.empty())
{
q.pop();
}
return true;
}
}
return viz[n];
}
int minim()
{
int m = INF, x = n;
while(x != 1)
{
m = min2(m, c[pred[x]][x]-f[pred[x]][x]);
x = pred[x];
}
return m;
}
void drum(int val)
{
int x = n;
while(x != 1)
{
f[pred[x]][x] += val;
f[x][pred[x]] -= val;
x = pred[x];
}
}
int main()
{
int a, b, i, sflux = 0;
in >> n >> m;
for(i = 1; i <= m; i++)
{
in >> a;
in >> b;
in >> c[a][b];
c[b][a] = -c[a][b];
}
while(bfs())
{
m = minim();
drum(m);
}
for(i = 1; i <= n; i++)
{
if(c[i][n] > 0)
{
sflux += f[i][n];
}
}
out << sflux;
return 0;
}