Cod sursa(job #1402433)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 26 martie 2015 16:23:28
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 kb
#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;
}