Cod sursa(job #1262802)

Utilizator armandpredaPreda Armand armandpreda Data 13 noiembrie 2014 16:06:31
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");

const int MAX=1000;
vector <int> lista[MAX+5];
queue <int> q;
int n,m,c[MAX+5][MAX+5],flux[MAX+5][MAX+5],flux_min,flux_max,tata[MAX+5];
bool viz[MAX+5];
bool bfs(int nod)
{
    while(!q.empty())q.pop();
    for(int i=1;i<=n;++i)viz[i]=tata[i]=0;
    q.push(nod);
    viz[nod]=1;
    while(!q.empty())
    {
        nod=q.front();
        q.pop();
        if(nod==n)
            return 1;
        for(int i=0;i<lista[nod].size();++i)
            if(viz[lista[nod][i]]==0 and c[nod][lista[nod][i]]-flux[nod][lista[nod][i]]>0)
            {
                q.push(lista[nod][i]);
                viz[lista[nod][i]]=1;
                tata[lista[nod][i]]=nod;
            }
    }
    return 0;
}
int main()
{
    int i;
    fin>>n>>m;
    for(i=1;i<=m;++i)
    {
        int x,y,capacitate;
        fin>>x>>y>>capacitate;
        lista[x].push_back(y);
        lista[y].push_back(x);
        c[x][y]=capacitate;
    }
    while(bfs(1))
    {
        flux_min=110001;
        for(i=n;i!=1;i=tata[i])
            flux_min=min(flux_min,c[tata[i]][i]-flux[tata[i]][i]);
        for(i=n;i!=1;i=tata[i])
        {
            flux[tata[i]][i]+=flux_min;
            flux[i][tata[i]]-=flux_min;
        }
        flux_max+=flux_min;
    }
    fout<<flux_max;
    return 0;
}