Cod sursa(job #1626706)

Utilizator radarobertRada Robert Gabriel radarobert Data 3 martie 2016 11:21:56
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <cstring>
#include <vector>

using namespace std;

vector<int> g[1002];
int c[1002][1002], f[1002][1002];
int q[1002], parent[1002];
int n;

bool bfs()
{
    bool vis[n+1];
    memset(vis, 0, sizeof(vis));
    vis[1] = 1;
    q[1] = 1;
    int qsize = 1;
    for (int i = 1; i <= qsize; i++)
    {
        int node = q[i];
        for (unsigned j = 0; j < g[node].size(); j++)
            if (!vis[g[node][j]] && c[node][g[node][j]] > f[node][g[node][j]])
            {
                vis[g[node][j]] = true;
                q[++qsize] = g[node][j];
                parent[g[node][j]] = node;
            }
    }
    return vis[n];
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    int m;
    scanf("%d%d", &n, &m);
    for (int i = 1, x, y, z; i <= m; i++)
    {
        scanf("%d%d%d", &x, &y, &z);
        g[x].push_back(y);
        g[y].push_back(x);
        c[x][y] = z;
    }

    int flow = 0;
    while (bfs())
    {
        for (int i = 0; i < g[n].size(); i++)
        {
            int fmax = c[g[n][i]][n] - f[g[n][i]][n];
            for (int j = g[n][i]; j != 1; j = parent[j])
                fmax = min(fmax, c[parent[j]][j] - f[parent[j]][j]);
            f[g[n][i]][n] += fmax;
            for (int j = g[n][i]; j != 1; j = parent[j])
            {
                f[parent[j]][j] += fmax;
                f[j][parent[j]] -= fmax;
            }
            flow += fmax;
        }
    }

    printf("%d\n", flow);

    return 0;
}