Cod sursa(job #2221494)

Utilizator VladTiberiuMihailescu Vlad Tiberiu VladTiberiu Data 14 iulie 2018 15:33:35
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 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()){
        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;
}