Cod sursa(job #883026)

Utilizator ericptsStavarache Petru Eric ericpts Data 19 februarie 2013 17:50:33
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
#define pb push_back
#define maxn 1005
int n,m;
int disp[maxn][maxn];
int used[maxn][maxn];
int TT[maxn];
int Q[maxn];
bool viz[maxn];
vector<int> graf[maxn];
void read()
{
    int a,b,c;
    in >> n >> m;
    while(m--)
    {
        in >> a >> b >> c;
        disp[a][b]+= c;
        graf[a].pb(b);
        graf[b].pb(a);
    }
}
vector<int> :: iterator it;
bool BFS()
{
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    Q[0]=1;
    Q[1]=1;
    int i,now;
    for(i=1;i<=Q[0];++i)
    {
        now = Q[i];
        if(now == n)
            continue;
        for(it=graf[now].begin();it != graf[now].end(); ++ it)
        {
            if(disp[now][*it] == used[now][*it] || viz[*it])
                continue;
            viz[*it]=1;
            Q[++Q[0]]=*it;
            TT[*it]=now;
        }
    }
    return viz[n];
}

int main()
{
    int flow = 0,now,fmin;
    read();
    for(;BFS();)
    {
        for(it = graf[n].begin(); it != graf[n].end(); ++ it)
        {
            if(used[*it][n] == disp[*it][n] || !viz[*it])
                continue;
            TT[n] = *it;
            fmin = 1 << 28;
            for(now=n;now != 1; now = TT[now])
                fmin = min(fmin,disp[TT[now]][now] - used[TT[now]][now]);
            if(!fmin)
                continue;
            for(now=n;now != 1;now = TT[now])
            {
                used[TT[now]][now] += fmin;
                used[now][TT[now]] -= fmin;
            }
            flow += fmin;
        }
    }
    out << flow << "\n";
    return 0;
}