Cod sursa(job #808416)

Utilizator SpiriFlaviuBerbecariu Flaviu SpiriFlaviu Data 6 noiembrie 2012 19:12:32
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>

using namespace std;

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

vector<int> v[1001];
vector<int> dest;
int c[1001][1001],f[1001][1001],n,m,t[1001],flux;
bool visited[1001];
queue<int> q;

void solve()
{
    int fmin = 999999999;
    for(int i=n;i!=1;i = t[i])
        fmin = min(fmin,c[t[i]][i] - f[t[i]][i]);
    for(int i=n;i!=1;i = t[i])
    {
        f[t[i]][i] += fmin;
        f[i][t[i]] -= fmin;
    }
    flux += fmin;
}


bool BFS()
{

    for(int i=1;i<=n;i++)
        visited[i] = false;
    for(int i=1;i<=n;i++)
        t[i] = 0;
    q.push(1);
    while(!q.empty())
    {
        int x = q.front();
        for(unsigned int i=0;i<v[x].size();i++)
            if(!visited[v[x][i]] && c[x][v[x][i]] > f[x][v[x][i]] )
            {
                q.push(v[x][i]);
                visited[v[x][i]] = true;
                t[v[x][i]] = x;
                if(v[x][i]==n)
                    solve();
            }
        q.pop();
    }
    return visited[n];
}







int main()
{
    fin>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fin>>x>>y;
        fin>>c[x][y];
        v[x].push_back(y);
        if(y==n)
            dest.push_back(x);
    }

    while(BFS());

    fout<<flux<<'\n';
    fin.close();
    fout.close();
    return 0;
}