Cod sursa(job #2348807)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 20 februarie 2019 00:07:01
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <fstream>
#include <vector>
#include <queue>
#include <cstdio>
#define VAL 1005
#define INF 1000000000

using namespace std;

int N, M, i, j, ANS, a, b;
int dp[VAL][VAL], c, X;
int prec[VAL], p;
bool viz[VAL];
queue <int> Q;
vector <int> G[VAL];
vector <int> :: iterator it;

bool BFS()
{
    for (j=1; j<=N; j++)
      viz[j]=false;
    viz[1]=true;
    Q.push(1);
    while (Q.empty()==false)
    {
        p=Q.front();
        Q.pop();
        if (p==N)
          continue;
        for (it=G[p].begin(); it!=G[p].end(); it++)
        {
            if (viz[*it]==false && dp[p][*it]>0)
            {
                viz[*it]=true;
                prec[*it]=p;
                Q.push(*it);
            }
        }
    }
    return viz[N]==true;
}

void Ford_Fulkerson()
{
    while (BFS()==true)
    {
        for (j=0; j<G[N].size(); j++)
        {
            prec[N]=G[N][j];
            X=INF;
            for (i=N; i!=1; i=prec[i])
              X=min(X, dp[prec[i]][i]);
            if (X==0)
              continue;
            for (i=N; i!=1; i=prec[i])
            {
                dp[prec[i]][i]-=X;
                dp[i][prec[i]]+=X;
            }
            ANS+=X;
        }
    }
}

int main()
{
    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);
    scanf("%d %d", &N, &M);
    for (i=1; i<=M; i++)
    {
        scanf("%d %d %d", &a, &b, &c);
        G[a].push_back(b);
        G[b].push_back(a);
        dp[a][b]=c;
    }
    Ford_Fulkerson();
    printf("%d\n", ANS);
    return 0;
}