Cod sursa(job #2244512)

Utilizator danielsociuSociu Daniel danielsociu Data 22 septembrie 2018 21:57:44
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <cstring> //memset
#include <vector>
std::ifstream cin("maxflow.in");
std::ofstream cout("maxflow.out");
#define maxn 1050
#define min(a,b) a<b?a:b
using namespace std;
vector<int> adj[maxn];
int C[maxn][maxn],F[maxn][maxn], ant[maxn], viz[maxn],TT[maxn];
int N,M,Fmax;

int BF_Edmons(){
    ant[0]=1;
    ant[1]=1;
    memset(viz,0,sizeof(viz));
    viz[1]=1;

    for(int i=0;i<=ant[0];i++){
        int nod=ant[i];
        if(nod==N)
            continue;

        for(unsigned int i=0;i<adj[nod].size();i++){
            int dest=adj[nod][i];
            if(viz[dest]||C[nod][dest]==F[nod][dest])
                continue;
            ant[++ant[0]]=dest;
            TT[dest]=nod;
            viz[dest]=1;
        }
    }
    return viz[N];
}

int main()
{
    int x,y,c,mflux;
    cin>>N>>M;
    for(;M--;){
        cin>>x>>y>>c;
        adj[x].push_back(y);
        adj[y].push_back(x);
        C[x][y]+=c;
    }
    for(Fmax=0;BF_Edmons();)
        for(unsigned int i=0;i<adj[N].size();i++){
            int nod=adj[N][i];
            if(C[nod][N]==F[nod][N])
                continue;
            ant[N]=nod;
            mflux=0;
            for(int wh=N;wh!=1;wh=ant[wh])
                mflux=min(mflux, C[nod][wh]-F[nod][wh]);
            if(mflux==0)
                continue;
            for(int wh=N;wh!=1;wh=ant[wh]){
                F[nod][wh]+=mflux;
                F[wh][nod]-=mflux;
            }
            Fmax+=mflux;
        }
    cout<<Fmax;
}