Cod sursa(job #928244)

Utilizator swim406Teudan Adina swim406 Data 26 martie 2013 12:53:45
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <stdio.h>
#include <vector>
#include <queue>
#define nmax 1001
#define oo 0x3f3f3f3f //infinit

using namespace std;

vector <int> G[nmax];
int cap[nmax][nmax];
bool use[nmax];
queue <int> q;

int flux[nmax][nmax];
int t[nmax];
int n, m;

int bfs (){
    for (int i = 0; i <= n; ++i) use[i] = 0;
    for (int i = 0; i <= n; ++i) t[i] = 0;
    q.push(1);
    use[1] = 1;
    while (!q.empty())     {
        int u = q.front();
        if(u == n) {
            q.pop();
            continue;
        }
        for (int i = 0; i < G[u].size(); ++i) {
            int dest1 = G[u][i];
            int cap1 = cap[u][dest1];
            if (!use[dest1])
                if (cap1 - flux[u][dest1] > 0)
                {
                    q.push(dest1);
                    t[dest1] = u;
                    use[dest1] = 1;
                }
        }
        q.pop();
    }
    return use[n];
}

int edmond_karp(){
    int j;
    int minn;
    int flow = 0;
    while(bfs()) {
        for(int i = 0; i < G[n].size(); i++)
            if(use[G[n][i]] && flux[G[n][i]][n] < cap[G[n][i]][n]){
                t[n] = G[n][i];
                minn = oo;
                for (j = n; t[j] !=0; j = t[j])
                    if(minn > cap[t[j]][j]-flux[t[j]][j])
                        minn = cap[t[j]][j] - flux[t[j]][j];
                for (j = n; t[j] !=0; j = t[j]) {
                    flux[t[j]][j] += minn;
                    flux[j][t[j]] -= minn;
                }
                flow += minn;
            }
    }
    return flow;
}
int main() {
    int x, y, z;
    freopen ("maxflow.in", "r", stdin);
    freopen ("maxflow.out", "w", stdout);
    scanf ("%d %d", &n, &m);
    for (int i = 1; i <= m; ++i) {
        scanf ("%d %d %d", &x, &y, &z);
        G[x].push_back(y);
        G[y].push_back(x);
        cap[x][y] = z;
    }
    printf ("%d", edmond_karp());
}