Cod sursa(job #1686166)

Utilizator MihaiEMihaiE MihaiE Data 12 aprilie 2016 09:11:28
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <stdio.h>
#include <queue>
#include <vector>
#include <cstring>
#define nmax 1010

using namespace std;

int n,m,x,y,z,fmax;
int capacity[nmax][nmax],flux[nmax][nmax];
int tata[nmax];
bool fr[nmax];
vector <int> g[nmax];
queue <int> que;

bool bfs()
{
    memset(fr,0,sizeof(fr));

    que.push(1); fr[1]=1;

    while (!que.empty()) {
        int x=que.front(); que.pop();

        if (x==n) continue;

        for (int i=0;i<(int)g[x].size();i++)
            if (!fr[g[x][i]] && flux[x][g[x][i]]!=capacity[x][g[x][i]]) {
                tata[g[x][i]]=x; fr[g[x][i]]=true; que.push(g[x][i]);
            }
    }

    return (fr[n]);

}

int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);

    scanf("%d %d",&n,&m);

    for (int i=1;i<=m;i++) {
        scanf("%d %d %d",&x,&y,&z); g[x].push_back(y); g[y].push_back(x); capacity[x][y]=z;
    }

    while (bfs()) {
        for (int i=0;i<g[n].size();i++)
            if (fr[g[n][i]] && capacity[g[n][i]][n]!=flux[g[n][i]][n]) {
                tata[n]=g[n][i]; int fmin=2e9;
                for (int j=n;j>1;j=tata[j]) fmin=min(fmin,capacity[tata[j]][j]-flux[tata[j]][j]);

                if (fmin==0) continue;

                for (int j=n;j>1;j=tata[j]) {
                    flux[tata[j]][j]+=fmin;
                    flux[j][tata[j]]-=fmin;
                }

                fmax+=fmin;

            }
    }

    printf("%d",fmax);

    return 0;
}