Cod sursa(job #1393409)

Utilizator AeroHHorea Stefan AeroH Data 19 martie 2015 13:21:43
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 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));
    queue<int> Q;
    Q.push(1);
    p[1]=-1;
    while(Q.size())
        {
            int x=Q.front();
            Q.pop();
            for(int i=0;i<v[x].size();++i)
                {
                    y=v[x][i];
                    if (cost[x][y] > 0 && !p[y])
                        {
                            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 y=v[n][i];
                    if (p[y] && cost[y][n] > 0)
                        {
                            int cap=cost[y][n];

                            for(i=y;p[i]!=-1;i=p[i])
                                cap=min(cap,cost[p[i]][i]);
                            for(i=y;p[i]!=-1;i=p[i])
                                {
                                    cost[p[i]][i]-=cap;
                                    cost[i][p[i]]+=cap;
                                }
                            flux +=cap;
                        }
                }

        }
    g<<flux;
    return 0;
}