Cod sursa(job #2221496)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 14 iulie 2018 15:39:13
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.65 kb
#include <bits/stdc++.h>

using namespace std;

const int NMax = 1003;

int x,y,C,n,m;
int tata[NMax],viz[NMax];
int c[NMax][NMax],f[NMax][NMax];
vector<int> G[NMax];

int BFS(){
    memset(viz,0,sizeof(viz));
    queue<int> q;
    q.push(1);
    viz[1] = 1;
    while(!q.empty()){
        int nod = q.front();
        q.pop();
        if(n == nod)
            continue;
        for(int i = 0; i < G[nod].size(); ++i){
            if(!viz[G[nod][i]] && f[nod][G[nod][i]] != c[nod][G[nod][i]]){
                q.push(G[nod][i]);
                viz[G[nod][i]] = 1;
                tata[G[nod][i]] = nod;
            }
        }
    }
    return viz[n];
}
int main()
{
    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,&C);
        G[x].push_back(y);
        G[y].push_back(x);
        c[x][y] = C;
    }
    int F = 0;
    tata[1] = 0;
    while(BFS()){
        for(int i = 0; i < G[n].size(); ++i){
            int e = 0;
            if(viz[G[n][i]] == 1 && f[G[n][i]][n] != c[G[n][i]][n])
                e = G[n][i];
            else continue;
            tata[n] = e;
            int x = n;
            int mn = 110003;
            while(tata[x] != 0){
                mn = min(mn, c[tata[x]][x] - f[tata[x]][x]);
                x = tata[x];
            }
            x = n;
            while(tata[x] != 0){
                f[tata[x]][x] += mn;
                f[x][tata[x]] -= mn;
                x = tata[x];
            }
            F += mn;
        }
    }
    printf("%d\n",F);
    return 0;
}