Cod sursa(job #682846)

Utilizator mihai995mihai995 mihai995 Data 19 februarie 2012 16:59:56
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <cstring>
#include <vector>
using namespace std;

const int N=1001,inf=1<<30;
int cost[N][N],flux[N][N],T[N],v[N],st,dr,n;
bool use[N];
vector<int> a[N];

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

inline int pump(int x)
{
    return cost[T[x]][x]-flux[T[x]][x];
}

inline void push(int x)
{
    v[++dr]=x;
}

inline int pop()
{
    return v[st++];
}

void bfs(int x,int D)
{
    memset(use,false,sizeof(use));
    st=0;dr=-1;
    push(x);
    while (st<=dr)
    {
        x=pop();
        if (x==D)
            return;
        for (vector<int>::iterator i=a[x].begin();i!=a[x].end();i++)
            if (!use[*i] && flux[x][*i]<cost[x][*i])
            {
                push(*i);
                T[*i]=x;
            }
    }
}

int flow(int S,int D)
{
    int add=1,F=0;
    while (add)
    {
        bfs(S,D);
        add=inf;
        for (int i=D;i!=S;i=T[i])
            add=min(add,pump(i));
        for (int i=D;i!=S;i=T[i])
        {
            flux[T[i]][i]+=add;
            flux[i][T[i]]-=add;
        }
        F+=add;
    }
    return F;
}

int main()
{
    int m,x,y,c;
    in>>n>>m;
    while (m--)
    {
        in>>x>>y>>c;
        a[x].push_back(y);
        a[y].push_back(x);
        cost[x][y]=c;
    }
    out<<flow(1,n)<<"\n";
    return 0;
}