Cod sursa(job #1513036)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 28 octombrie 2015 21:56:23
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
int n, m, i, minim, p, sum, u, x, y, z;
vector<int> v[1005];
bitset<1005> viz;
int c[1005][1005], f[1005][1005], t[1005], s[1005];
ifstream fin("maxflow.in");
ofstream fout("maxflow.out");
int bfs(){
    int p, u, i, vecin, nod;
    int ok = 0;
    viz.reset();
    p = u = 1;
    s[p] = 1;
    viz[1] = 1;
    while(p <= u){
        nod = s[p];
        for(i = 0; i < v[nod].size(); i++){
            vecin = v[nod][i];
            if(viz[vecin] == 0 && f[nod][vecin] < c[nod][vecin]){
                viz[vecin] = 1;
                u++;
                s[u] = vecin;
                t[vecin] = nod;
                if(vecin == n){
                    ok = 1;
                }
            }
        }
        p++;
    }
    return ok;
}
int main(){
    fin>> n >> m;
    for(i = 1; i <= m; i++){
        fin>> x >> y >> z;
        v[x].push_back(y);
        v[y].push_back(x);
        c[x][y] = z;
    }
    while(bfs()){
        for(i = 0; i < v[n].size(); i++){
            if(v[n][i] == t[n]){
                minim = c[ t[n] ][n] - f[ t[n] ][n];
                p = t[n];
                while(t[p] > 0){
                    minim = min(minim, c[ t[p] ][ p ] - f[ t[p] ][ p ]);
                    p = t[p];
                }
                sum += minim;
                f[ t[n] ][n] += minim;
                f[ n][ t[n] ] -= minim;
                p = t[n];
                while(t[p] > 0){
                    f[ t[p] ][p] += minim;
                    f[ p][ t[p] ] -= minim;
                    p = t[p];
                }
            }
        }
    }
    fout<< sum <<"\n";
    return 0;
}