Cod sursa(job #2329856)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 27 ianuarie 2019 16:09:51
Problema Flux maxim Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.85 kb
#include <stdio.h>
#include <deque>
#include <iostream>
using namespace std;
FILE *in,*out;

int n,m,nr=1,flux;
int start[1002],used[1002],t[1002],c[1002][1002],f[1002][1002];

deque <int> deq;

struct graph {
    int node,next;
} v[10002];

void read() {
    int k=0,x,y,z;
    fscanf(in,"%d %d",&n,&m);
    for(int i=1; i<=m; i++) {
        fscanf(in,"%d %d %d",&x,&y,&z);
        v[++k].node=y;
        v[k].next=start[x];
        start[x]=k;

        v[++k].node=x;
        v[k].next=start[y];
        start[y]=k;

        c[x][y]=z;
    }
}

int bfs() {
    deq.push_back(1);
    while(!deq.empty()) {
        int node=deq.front();
        deq.pop_front();
        for(int vec=start[node]; vec; vec=v[vec].next) {
            if(used[v[vec].node]<nr && c[node][v[vec].node]>f[node][v[vec].node]) {
                used[v[vec].node]=nr;
                t[v[vec].node]=node;
                if(v[vec].node!=n)
                    deq.push_back(v[vec].node);
            }
        }
    }
    if(used[n]==nr)
        return 1;
    return 0;
}

void fluxx() {
    for(int k=bfs(); k; k=bfs()) {
        for(int i=start[n]; i; i=v[i].next) {
            if(used[v[i].node]==nr && c[v[i].node][n]>f[v[i].node][n]) {
                t[n]=v[i].node;
                int minn=999999999;
                for(int j=n; j!=1; j=t[j])
                    minn=min(minn,c[t[j]][j]-f[t[j]][j]);
                if(minn>0) {
                    for(int j=n; j!=1; j=t[j]) {
                        f[t[j]][j]+=minn;
                        f[j][t[j]]-=minn;
                    }
                    flux+=minn;
                }
            }
        }
        nr++;
    }
    fprintf(out,"%d",flux);
}

int main() {
    in=fopen("maxflow.in","r");
    out=fopen("maxflow.out","w");
    read();
    fluxx();
    return 0;
}