Cod sursa(job #682856)

Utilizator mihai995mihai995 mihai995 Data 19 februarie 2012 17:20:22
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.66 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));
    memset(T,0,sizeof(use));
    st=0;dr=-1;
    push(x);
    use[x] = true;
    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])
            {
                use[*i] = true;
                push(*i);
                T[*i]=x;
            }
    }
}

int flow(int S,int D)
{
    int add=1,F=0;
    bool ok = true;
    while (ok)
    {
        bfs(S,D);
        ok = false;
        for (int x=1;x<=n;x++)
            if (flux[x][D]<cost[x][D])
            {
                add=cost[x][D]-flux[x][D];
                for (int i=x;i!=S && add > 0;i=T[i])
                    add=min(add,pump(i));
                if (!add) continue;
                ok = true;
                T[D]=x;
                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;
}