Pagini recente » Cod sursa (job #2213409) | Cod sursa (job #2811648) | Cod sursa (job #2619984) | Cod sursa (job #2066053) | Cod sursa (job #1402464)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define INF 0x4fffffff
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;
long long int totalFlow;
short bfs()
{
int i;
memset(visited, 0, memset_size);
visited[1] = 1;
queue<int> q;
vector<int>::iterator it, it_end;
q.push(1);
while (!q.empty())
{
i = q.front();
q.pop();
if (i == n) continue;
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;
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;
cameFrom[n] = *it;
for (i = n; i > 1; i = cameFrom[i])
{
if (j > capacity[cameFrom[i]][i] - flow[cameFrom[i]][i])
j = capacity[cameFrom[i]][i] - flow[cameFrom[i]][i];
}
if (j)
{
for (i = n; 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;
}