Cod sursa(job #2329839)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 27 ianuarie 2019 15:45:36
Problema Flux maxim Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 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];

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]=c[y][x]=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]>0){
                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]>0){
                t[n]=v[i].node;
                int minn=999999999;
                for(int j=n;j!=1;j=t[j])
                    minn=min(minn,c[t[j]][j]);
                for(int j=n;j!=1;j=t[j]){
                    c[t[j]][j]-=minn;
                    c[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;
}