Cod sursa(job #2237855)

Utilizator BiancaMariaVulsanVulsan Bianca Maria BiancaMariaVulsan Data 3 septembrie 2018 16:23:29
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <iostream>
#include <fstream>
#include <vector>
#define nmax 1024
#define inf 0x3f3f3f3f
#include <queue>
using namespace std;
ifstream f("maxflow.in");
ofstream g("maxflow.out");
int n,m,c[nmax][nmax], fx[nmax][nmax], t[nmax], viz[nmax];
vector < int > v[nmax];
queue <int> q;
void citire()
{
    int i,j,k,ct;
    f>>n>>m;
    for(k=1; k<=m; k++)
    {
        f>>i>>j>>ct;
        c[i][j]=ct;
        v[i].push_back(j);
        v[j].push_back(i);
    }
}

int bfs()
{// returneaza 1 daca exista drum pana la destinatie
    int nod,i;
    while(!q.empty())
        q.pop();
    for(i=1; i<=n; i++)
        viz[i]=0;

    viz[1]=1;
    q.push(1);
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        for(i=0; i<v[nod].size(); i++)
            if(viz[v[nod][i]]==0 && c[nod][v[nod][i]]>fx[nod][v[nod][i]])
        {
            viz[v[nod][i]]=1;
            t[v[nod][i]]=nod;
            q.push(v[nod][i]);
            if(v[nod][i]==n)
                return 1;
        }
    }
    return 0;
}

int main()
{
    citire();
    int nod, flux, fmin;
    for(flux=0; bfs(); flux+=fmin)
    {
        fmin=inf;
        for(nod=n; nod!=1; nod=t[nod])
            fmin=min(fmin, c[t[nod]][nod] - fx[t[nod]][nod]);
        for(nod=n; nod!=1; nod=t[nod])
            {
                fx[nod][t[nod]] -= fmin;
                fx[t[nod]][nod] += fmin;
            }
    }
    g<<flux;
    f.close();
    g.close();
    return 0;
}