Cod sursa(job #1393513)

Utilizator AeroHHorea Stefan AeroH Data 19 martie 2015 15:15:58
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <fstream>
#include <cstring>
using namespace std;

ifstream f("maxflow.in");
ofstream g("maxflow.out");

#define N 1005

int n,m,x,y,z,i,j,cost[N][N],p[N],flux;
vector<int> v[N];

int dfs()
{
    memset(p,0,sizeof(p));
    p[1]=-1;

    queue<int> q;
    q.push(1);
    while(q.size())
        {
            int x=q.front();
            q.pop();
            for (int i=0;i<v[x].size();++i)
                {
                    int y=v[x][i];
                    if(p[y] == 0 && cost[x][y]>0)
                        {
                            p[y]=x;
                            q.push(y);
                        }
                }
        }
    return p[n];
}

int main()
{
    f>>n>>m;
    for(i=1;i<=m;++i)
        {
            f>>x>>y>>z;
            cost[x][y]=z;
            v[x].push_back(y);
            v[y].push_back(x);
        }

    while(dfs())
        for(i=0;i<v[n].size();++i)
            {
                int x=v[n][i];
                if (cost[x][n] > 0 && p[x] != 0)
                    {
                        int cap=cost[x][n];
                        for(j=x;j!=1;j=p[j])cap=min(cap,cost[p[j]][j]);
                        for(j=x;j!=1;j=p[j])
                            {
                                cost[p[j]][j]-=cap;
                                cost[j][p[j]]+=cap;
                            }
                        cost[x][n]-=cap;
                        flux+=cap;
                    }
            }
    g<<flux;

    return 0;
}