Cod sursa(job #1942036)

Utilizator GandalfTheWhiteGandalf the White GandalfTheWhite Data 27 martie 2017 19:21:31
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define N 1001
#define inf 0x7fffffff
using namespace std;

vector <int> G[N];
vector <int>::iterator it;
int c[N][N],f[N][N],t[N],flow=0,s,d,n;

void Read(){

    int x,y,m;
    freopen("maxflow.in","r",stdin);

    scanf("%d%d",&n,&m);
    while (m--)
        {
        scanf("%d%d",&x,&y);
        scanf("%d",&c[x][y]);
        G[x].push_back(y);
        G[y].push_back(x);
        }
}

inline int bfs(){

    int ok=0,node;
    queue <int> Q;

    memset(t,0,sizeof(t));
    t[s]=-1;Q.push(s);

    while (!Q.empty())
    {
     node=Q.front();Q.pop();

     for (it=G[node].begin();it!=G[node].end();++it)
         if (t[*it]==0 && c[node][*it]>f[node][*it])
             if(*it!=d) {
                         t[*it]=node;
                         Q.push(*it);
                        }
             else ok=1;
    }
    return ok;
}

void Dinic(){

    int mini,node;
    s=1;d=n;

    for (int drum=bfs();drum;drum=bfs())

        for (it=G[d].begin();it!=G[d].end();++it)
            if (t[*it] && c[*it][d]>f[*it][d])
                {
                t[d]=*it;
                mini=inf;

                for (node=d;node!=s;node=t[node])
                    mini=min(mini,c[t[node]][node]-f[t[node]][node]);

                if(mini<=0) continue;

                flow+=mini;

                for (node=d;node!=s;node=t[node])
                    {
                    f[t[node]][node]+=mini;
                    f[node][t[node]]-=mini;
                    }
                }
}

void Write(){

    freopen("maxflow.out","w",stdout);

    printf("%d",flow);
}

int main()
{
    Read();
    Dinic();
    Write();
    return 0;
}