Cod sursa(job #2122471)

Utilizator monicalMonica L monical Data 5 februarie 2018 10:07:11
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<bits/stdc++.h>

using namespace std;

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

const int N = 1001;

vector<int> v[N];
queue<int> Q;

int n , m , FL, t[1001], C[1001][1001], F[1001][1001];

int BF()
{
    int i,nod,vec;
    memset(t,0,sizeof(t));
    t[1]=-1;
    queue<int> Q;
    Q.push(1);

    while(!Q.empty())
    {
        nod=Q.front(); Q.pop();
        for(i=0;i<v[nod].size();i++)
        {   vec=v[nod][i];
            if(t[vec] || C[nod][vec]==F[nod][vec])continue;
            t[vec]=nod;
            Q.push(vec);
            if(vec==n)return 1;
        }

    }
    return 0;
}

void dinic()
{
    int i,j,FC;

    while(BF())
      for(i=1;i<=n;i++)
      {
        if(!t[i] || C[i][n]==F[i][n])continue;

        FC=C[i][n]-F[i][n];
        for(j=i;j!=1;j=t[j])
            FC=min(FC,C[t[j]][j]-F[t[j]][j]);

        if(!FC)continue;

        F[i][n]+=FC;F[n][i]-=FC;

        for(j=i;j!=1;j=t[j])
          {
            F[t[j]][j]+=FC;
            F[j][t[j]]-=FC;
          }

        FL+=FC;
      }
}

int main()
{
    int X,Y,Z;
    f>>n>>m;
    for(;m;m--)
    {
        f>>X>>Y>>Z;
        v[X].push_back(Y);
        v[Y].push_back(X);
        C[X][Y]=Z;
    }


    dinic();
    g<<FL<<'\n';

    return 0;
}