Pagini recente » Cod sursa (job #727608) | Cod sursa (job #237275) | Borderou de evaluare (job #1566996) | Cod sursa (job #1988425) | Cod sursa (job #905016)
Cod sursa(job #905016)
#include <cstring>
#include <utility>
#include <fstream>
#include <queue>
#define oo int(2e9)
#define MAX 1010
#define mp make_pair
using namespace std;
bool viz[MAX];
int x, y, z, i, n, m, flow, cost, solFlow, from[MAX], D[MAX], cap[MAX][MAX];
priority_queue < pair<int, int> > Q;
bool Dijkstra()
{
while(!Q.empty()) Q.pop();
memset(from, 0, sizeof(from));
memset(viz, 0, sizeof(viz));
Q.push(mp(oo, 1));
for(i = 1; i <= n; i++) D[i] = oo;
D[1] = 0;
while(!Q.empty())
{
x = Q.top().second;
cost = Q.top().first;
Q.pop();
if(viz[x]) continue; else viz[x] = 1;
for(i = 1; i <= n; i++)
if(cap[x][i] and viz[i] == 0 and D[i] > min(cost, cap[x][i]))
{
D[i] = min(cost, cap[x][i]);
from[i] = x;
Q.push(mp(D[i], i));
}
}
return D[n] != oo;
}
int main()
{
ifstream fi("maxflow.in");
ofstream fo("maxflow.out");
fi >> n >> m;
for(i = 1; i <= m; i++)
{
fi >> x >> y >> z;
cap[x][y] = z;
cap[y][x] = 0;
}
while(Dijkstra())
{
flow = int(2e9);
for(i = n; from[i] != 0; i = from[i])
flow = min(flow, cap[from[i]][i]);
for(i = n; from[i] != 0; i = from[i])
cap[from[i]][i] -= flow, cap[i][from[i]] += flow;
solFlow += flow;
}
fo << solFlow << "\n";
return 0;
}