Cod sursa(job #1262804)

Utilizator RathebaSerbanescu Andrei Victor Ratheba Data 13 noiembrie 2014 16:07:46
Problema Flux maxim Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <queue>

using namespace std;
#define MAX 1005

bool min(int a, int b){if(a<b)return a; return b;}
bool bfs();

queue<int> q;
vector<int> graf[MAX];
int cap[MAX][MAX], flux[MAX][MAX], viz[MAX], n, vtata[MAX];
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    int m, i, a, b, c, fmin, fmax=0;
    scanf("%d%d", &n, &m);
    for(i=1; i<=m; i++)
    {
        scanf("%d%d%d",&a,&b,&c);
        graf[a].push_back(b);
        graf[b].push_back(a);
        cap[a][b] = c;
    }
    while(bfs())
    {
        fmin = (1LL<<31)-1;
        for(i=n; i!=1; i= vtata[i]){
            fmin = min(fmin, cap[vtata[i]][i]-flux[vtata[i]][i]);
        }
        for(i=n; i!=1; i=vtata[i])
        {
            flux[vtata[i]][i] += fmin;
            flux[i][vtata[i]] -= fmin;
        }

        fmax += fmin;
    }
    printf("%d\n", fmax);
    return 0;
}
bool bfs()
{

    int tata, fiu, i;
    viz[1]=1;
    vtata[1]=1;
    while(!q.empty())q.pop();
    for(i=2; i<=n; i++)viz[i]=vtata[i]=0;
    q.push(1);
    while(!q.empty())
    {
        tata = q.front();
        if(tata == n)
            break;
        for(i=0; i<graf[tata].size(); i++)
        {
            fiu = graf[tata][i];
            if(viz[fiu] == 0 and cap[tata][fiu]-flux[tata][fiu]>0){
                q.push(fiu);
                viz[fiu] = viz[tata]+1;
                vtata[fiu] = tata;
            }
        }
        q.pop();
    }
    if(viz[n] == 0) return 0;

    return 1;
}