Cod sursa(job #1716667)

Utilizator refugiatBoni Daniel Stefan refugiat Data 13 iunie 2016 12:48:26
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <bitset>
using namespace std;
ifstream si("maxflow.in");
ofstream so("maxflow.out");
const int inf=1000000000;
vector<int> v[1010];
queue<int> q;
bitset<1010>vaz;
int cap[1010][1010],flow[1010][1010],tata[1010],sursa,dest;
int bfs()
{
    int i;
    for(i=sursa;i<=dest;i++)
        vaz[i]=0;
    q.push(sursa);
    vaz[sursa]=1;
    while(!q.empty())
    {
        int nod=q.front();
        q.pop();
        int n=v[nod].size();
        for(i=0;i<n;++i)
        {
            if(!vaz[v[nod][i]]&&cap[nod][v[nod][i]]>flow[nod][v[nod][i]])
            {
                vaz[v[nod][i]]=1;
                tata[v[nod][i]]=nod;
                if(v[nod][i]!=dest) q.push(v[nod][i]);
            }
        }
    }
    return vaz[dest];
}
int main()
{
    int n,m;
    si>>n>>m;
    int i,a,b,c,sol=0;
    for(i=0;i<m;++i)
    {
        si>>a>>b>>c;
        v[a].push_back(b);
        v[b].push_back(a);
        cap[a][b]=c;
    }
    sursa=1;
    dest=n;
    while(bfs())
    {
        vector<int>::iterator it;
        int s;
        for(it=v[dest].begin();it!=v[dest].end();it++)
            if(vaz[*it]&&cap[*it][dest]>flow[*it][dest])
            {
                tata[dest]=*it;
                s=inf;
                for(int i=dest;i!=sursa;i=tata[i])
                    s=min(s,cap[tata[i]][i]-flow[tata[i]][i]);
                for(int i=dest;i!=sursa;i=tata[i])
                {
                    flow[tata[i]][i]+=s;
                    flow[i][tata[i]]-=s;
                }
                sol+=s;
            }
    }
    so<<sol<<'\n';
    return 0;
}