Cod sursa(job #2594946)

Utilizator cyg_vladioanBirsan Vlad cyg_vladioan Data 6 aprilie 2020 20:06:44
Problema Flux maxim Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int NMAX = 1000;
const int INF = 2.e9;
int c[NMAX + 5][NMAX + 5] , f[NMAX + 5][NMAX + 5] , viz[NMAX + 5] , n , s , t;
vector <int> G[NMAX + 5];
int bfs()
{
    int u , v , j;
    memset(viz , 0 , sizeof(viz));
    viz[s] = -1;
    queue <int> q;
    q.push(s);
    while(!q.empty())
    {
        u = q.front();
        q.pop();
        for(j = 0 ; j < G[u].size() ; j ++)
        {
            v = G[u][j];
            if(c[u][v] - f[u][v] > 0 && !viz[v])
            {
                viz[v] = u;
                q.push(v);
            }
        }
    }
    if(!viz[t])
        return 0;
    return 1;
}
int get_flow()
{
    int i , flow;
    flow = INF;
    i = t;
    while(viz[i] != -1)
    {
        flow = min(flow , c[viz[i]][i] - f[viz[i]][i]);
        i = viz[i];
    }
    return flow;
}
void set_flow(int flow)
{
    int i = t;
    while(viz[i] != -1)
    {
        f[viz[i]][i] = f[viz[i]][i] + flow;
        f[i][viz[i]] = f[i][viz[i]] - flow;
        i = viz[i];
    }
}
int max_flow()
{
    int i , flow = 0;
    while(bfs())
        set_flow(get_flow());
    for(i = 1 ; i <= n ; i ++)
        flow = flow + f[s][i];
    return flow;
}
int main()
{
    freopen("maxflow.in" , "r" , stdin);
    freopen("maxflow.out" , "w" , stdout);
    int m , i , x , y , z;
    scanf("%d%d" , &n , &m);
    for(i = 1 ; i <= m ; i ++)
    {
        scanf("%d%d%d" , &x , &y , &z);
        G[x].push_back(y);
        G[y].push_back(x);
        c[x][y] = c[x][y] + z;
    }
    s = 1;
    t = n;
    printf("%d\n" , max_flow());
    return 0;
}