Cod sursa(job #1864038)

Utilizator Malan_AbeleMalan Abele Malan_Abele Data 31 ianuarie 2017 14:06:12
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream in("maxflow.in");
ofstream out("maxflow.out");
int n,m,flow;
struct nod{
    int vecin;
    struct nod *urm;
}*l[1001],*q;//graf
bool viz[1001];
int c[1001][1001];//matricea costurilor
int p/*arinti*/[1001],coada/*pt. parcurgere latime*/[1001];

inline int mn(int a,int b){
    if(a<b)
        return a;
    else
        return b;
}

void actualizare(int st, int dt){
    int mini=2147483647;
    int aux=dt;
    while(aux>st){
        mini=mn(mini,c[p[aux]][aux]);
        aux=p[aux];
    }
    flow+=mini;
    aux=dt;

    while(aux>st){
        c[p[aux]][aux]-=mini;
        c[aux][p[aux]]+=mini;
        aux=p[aux];
    }
}

bool bfs(int st, int dt){//start si destinatie
    int inc=1,sf=1,noda;
    coada[sf]=st;

    for(int i=1;i<=n;++i)
        viz[i]=false;
    viz[st]=true;

    while(inc<=sf){
        noda=coada[inc];
        for(struct nod *q=l[noda];q!=NULL;q=q->urm){
            if(viz[q->vecin]==false && c[noda][q->vecin]>0){
                p[q->vecin]=noda;
                if(q->vecin==n){
                    actualizare(st,dt);
                    return true;
                }
                else{
                    ++sf;
                    coada[sf]=q->vecin;
                    viz[q->vecin]=true;
                }
            }
        }
        ++inc;
    }
    return false;
}
int main()
{
    in>>n>>m;
    int a,b,val;
    for(int i=1;i<=m;++i){
        in>>a>>b>>val;
        c[a][b]=val;

        q=new nod;
        q->vecin=b;
        q->urm=l[a];
        l[a]=q;

        q=new nod;
        q->vecin=a;
        q->urm=l[b];
        l[b]=q;
    }
    while(bfs(1,n)==true){}
    out<<flow;
    return 0;
}