Cod sursa(job #1216656)

Utilizator rangerChihai Mihai ranger Data 5 august 2014 12:13:19
Problema Flux maxim Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define pb push_back
#define mp make_pair
using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int NMAX = 1024, inf = 1000000000;
vector<int> g[NMAX], sol;
queue<int> q;

int C[NMAX][NMAX],F[NMAX][NMAX],P[NMAX],V[NMAX];
int n,m,i,j,k,x,y,z,flow,fmin;

int bfs()
{
    int ind=0,i;
    queue<int> q1; swap(q,q1);
    vector<int> sol1;
    swap(sol1,sol);
    q.push(1);
    memset(V,0,sizeof(V));
    V[1]=1;
    while (!q.empty())
    {
        int v=q.front(); q.pop();
        for (i=0;i<g[v].size();i++)
        {
            int to=g[v][i];
            if (!V[to] && F[v][to]<C[v][to])
            {
                if (F[to][n]<C[to][n])
                {
                    ind=1;
                    sol.pb(to);
                    V[to]=1;
                    P[to]=v;
                }
                q.push(to);
                V[to]=1;
                P[to]=v;
            }
        }
    }
    return ind;
}

int main()
{
    cin>>n>>m;
    for (i=1;i<=m;i++)
    {
        cin>>x>>y>>z;
        g[x].pb(y);
        g[y].pb(x);
        C[x][y]+=z;
    }



    for (flow=0; bfs();)
    {
        for (j=0;j<sol.size();j++)
        {
                int v=sol[j];
                fmin=inf;
                P[n]=v;
                for (k=n;k!=1;k=P[k])
                    fmin=min(fmin,C[P[k]][k]-F[P[k]][k]);
                for (k=n;k!=1;k=P[k])
                {
                    F[P[k]][k]+=fmin;
                    F[k][P[k]]-=fmin;
                }
                flow+=fmin;

        }
    }
    cout<<flow;
    return 0;


}