Cod sursa(job #2119590)

Utilizator lorena1999Marginean Lorena lorena1999 Data 1 februarie 2018 14:21:00
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <climits>
#define MAX 1001
#define INF INT_MAX

using namespace std;

ifstream fi("maxflow.in");
ofstream g("maxflow.out");

vector < int > v[MAX];

queue < int > q;

int n, m;

int viz[MAX], c[MAX][MAX], f[MAX][MAX], T[MAX], flux;

void read()
    {
        int x, y, cap;
        fi>>n>>m;
        for(int i=1; i<=m; i++)
        {
            fi>>x>>y>>cap;
            v[x].push_back(y);
            v[y].push_back(x);
            c[x][y] = cap;
        }
    }

int main()
    {
        read();
        while(1)
        {
            for(int i=1; i<=n; i++)
                viz[i]=T[i]=0;
            q.push(1);
            while(!q.empty())
            {
                int nod = q.front();
                viz[nod]=1;
                q.pop();
                for(size_t i=0; i<v[nod].size(); i++)
                {
                    int node = v[nod][i];
                    if(c[nod][node]<=f[nod][node] || viz[node]==1)
                        continue;
                    T[node]=nod;
                    viz[node]=1;
                    q.push(node);
                }
            }
            if(viz[n]==0)
                break;
            for(size_t i=0; i<v[n].size(); i++)
            {
                int nod = v[n][i];
                if(c[nod][n]<=f[nod][n] || viz[nod]==0)
                    continue;
                int flow = INF;
                for(int node = n; node!=1; node=T[node])
                    flow = min(flow, c[T[node]][node]-f[T[node]][node]);
                if(flow==0)
                    continue;
                for(int node = n; node!=1; node=T[node])
                {
                    f[T[node]][node]+=flow;
                    f[node][T[node]]-=flow;
                }
                flux+=flow;
            }
        }
        g<<flux;
        fi.close();
        g.close();
        return 0;
    }