Pagini recente » Cod sursa (job #2835360) | Cod sursa (job #1482396) | Cod sursa (job #2762524) | Cod sursa (job #621258) | Cod sursa (job #1402433)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define INF 0x7fffffff
using namespace std;
vector<int> adjacentList[1001];
int capacity[1001][1001];
int flow[1001][1001];
int cameFrom[1001];
char visited[1002];
int n, memset_size;
short bfs()
{
int i;
memset(visited, 0, memset_size);
queue<int> q;
vector<int>::iterator it, it_end;
q.push(1);
while (!q.empty())
{
i = q.front();
q.pop();
for (it = adjacentList[i].begin(), it_end = adjacentList[i].end(); it != it_end; ++it)
{
if (!visited[*it] && capacity[i][*it] > flow[i][*it])
{
visited[*it] = 1;
cameFrom[*it] = i;
q.push(*it);
}
}
}
return visited[n];
}
int main()
{
FILE *fin = fopen ("maxflow.in", "r");
FILE *fout = fopen ("maxflow.out", "w");
int m, i, j, x, y;
long long int totalFlow = 0;
fscanf(fin, "%d %d", &n, &m);
memset_size = sizeof(int) * (n + 1);
for (i = 0; i < m; ++i)
{
fscanf(fin, "%d %d %d", &x, &y, &j);
adjacentList[x].push_back(y);
adjacentList[y].push_back(x);
capacity[x][y] = j;
}
vector<int>::iterator it, it_end;
while (bfs())
{
for (it = adjacentList[n].begin(), it_end = adjacentList[n].end(); it != it_end; ++it)
{
if (visited[*it] && capacity[*it][n] > flow[*it][n])
{
j = INF;
if (j > capacity[*it][n] - flow[*it][n])
j = capacity[*it][n] - flow[*it][n];
for (i = *it; i > 1; i = cameFrom[i])
{
if (j > capacity[cameFrom[i]][i] - flow[cameFrom[i]][i])
j = capacity[cameFrom[i]][i] - flow[cameFrom[i]][i];
}
for (i = *it; i > 1; i = cameFrom[i])
{
flow[cameFrom[i]][i] += j;
flow[i][cameFrom[i]] -= j;
}
totalFlow += j;
}
}
}
fprintf(fout, "%lld\n", totalFlow);
fclose(fin);
fclose(fout);
return 0;
}