Cod sursa(job #1087747)

Utilizator assa98Andrei Stanciu assa98 Data 19 ianuarie 2014 20:12:44
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <cstdio>
#include <algorithm>
#include <queue>
#include <cstring>

#define fi first
#define se second
#define pe pair<int,int>
#define mp make_pair

using namespace std;

const int MAX_N=1010;

int n;
vector<int> A[MAX_N];
int cap[MAX_N][MAX_N];
int flux[MAX_N][MAX_N];
bool viz[MAX_N];
int dad[MAX_N];

void bfs() {
    memset(viz,0,sizeof(viz));
    memset(dad,0,sizeof(dad));
    queue<int> Q;
    Q.push(1);
    viz[1]=true;
    while(!Q.empty()) {
        int nod=Q.front();
        Q.pop();
        for(auto it=A[nod].begin(); it!=A[nod].end(); it++) {
            if(cap[nod][*it]>flux[nod][*it]&&!viz[*it]) {
                Q.push(*it);
                viz[*it]=true;
                dad[*it]=nod;
            }
        }
    }
}

int solve() {
    int ans=0;
    while(true) {
        bfs();
        if(!dad[n]) {
            break;
        }
        
        int add=cap[dad[n]][n]-flux[dad[n]][n];
        int nod=n;
        while(nod!=1) {
            add=min(add,cap[dad[nod]][nod]-flux[dad[nod]][nod]);
            nod=dad[nod];
        }
        ans+=add;

        nod=n;
        while(nod!=1) {
            flux[dad[nod]][nod]+=add;
            flux[nod][dad[nod]]-=add;
            nod=dad[nod];
        }
        
        for(auto it=A[n].begin(); it!=A[n].end(); it++) {
            if(cap[*it][n]<=flux[*it][n]) {
                continue;
            }

            int add=cap[*it][n]-flux[*it][n];
            int nod=*it;
            while(nod!=1) {
                add=min(add,cap[dad[nod]][nod]-flux[dad[nod]][nod]);
                nod=dad[nod];
            }
            if(!ans) {
                continue;
            }

            ans+=add;

            flux[*it][n]+=add;
            flux[n][*it]-=add;
            nod=*it;
            while(nod!=1) {
                flux[dad[nod]][nod]+=add;
                flux[nod][dad[nod]]-=add;
                nod=dad[nod];
            }
        }

    }
    return ans;
}

int main() {
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        A[a].push_back(b);
        A[b].push_back(a);
        cap[a][b]=c;
    }
    printf("%d",solve());
    /*for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            if(cap[i][j]) {
                printf("%d %d %d/%d\n",i,j,flux[i][j],cap[i][j]);
            }
        }
    }*/
    return 0;
}