Cod sursa(job #672605)

Utilizator rootsroots1 roots Data 2 februarie 2012 19:58:38
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>

#define maxN 1001

using namespace std;

ifstream in;
ofstream out;

vector <int> g[maxN];

int c[maxN][maxN];
int f[maxN][maxN];

int T[maxN];

int flux=0;
int S;
int D;

inline int bfs()
{
    int ok=0;
    queue <int> q;
    memset(T,0,sizeof(T));

    T[S]=-1;
    q.push(S);

    for(int nod;!q.empty();q.pop())
    {
        nod=q.front();

        for(vector <int>::iterator it=g[nod].begin();it!=g[nod].end();++it)
            if(T[*it]==0&&c[nod][*it]>f[nod][*it])
            {
                if(*it!=D)
                {
                    T[*it]=nod;
                    q.push(*it);
                }
                else ok=1;
            }
    }

    return ok;
}

inline void dinic()
{
    for(int drum=bfs();drum;drum=bfs())
        for(vector <int>::iterator it=g[D].begin();it!=g[D].end();++it)
            if(T[*it]&&c[*it][D]>f[*it][D])
            {
                T[D]=*it;

                int min=0x7fffffff;

                for(int nod=D;nod!=S;nod=T[nod])
                    if(min>c[T[nod]][nod]-f[T[nod]][nod])
                        min=c[T[nod]][nod]-f[T[nod]][nod];

                if(min<=0) continue;
                flux+=min;

                for(int nod=D;nod!=S;nod=T[nod])
                {
                    f[T[nod]][nod]+=min;
                    f[nod][T[nod]]-=min;
                }
            }
}

int main()
{
    int M,N,x,y;

    memset(c,0,sizeof(c));
    memset(f,0,sizeof(f));

    in.open("maxflow.in");

    in>>N>>M;
    for(;M--;)
    {
        in>>x>>y;
        in>>c[x][y];

        g[x].push_back(y);
        g[y].push_back(x);
    }

    in.close();

    S=1;
    D=N;

    dinic();

    out.open("maxflow.out");

    out<<flux<<'\n';

    out.close();

    return 0;
}