Cod sursa(job #1217173)

Utilizator rangerChihai Mihai ranger Data 6 august 2014 19:58:57
Problema Flux maxim Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include<fstream>
#include<vector>
#include<queue>
#include<cstring>
#define pb push_back
using namespace std;

ifstream cin("maxflow.in");
ofstream cout("maxflow.out");
const int nmax = 1024;
vector<int> g[nmax];
queue<int> q;
int c[nmax][nmax],f[nmax][nmax],p[nmax],viz[nmax];
int n,m,x,y,z,i,j,mflow=0,fmin=0;

int bfs()
{
    while (q.size()) q.pop();
    q.push(1);
    memset(viz,0,sizeof(viz));
    viz[1]=1;
    while (!q.empty())
    {
        int v=q.front();q.pop();
        if (v==n) continue;
        for (int j=0;j<g[v].size();j++)
        {
            int to=g[v][j];
            if (viz[to] || c[v][to]==f[v][to]) continue;
            ++viz[to];
            p[to]=v;
            q.push(to);
        }
    }
    return viz[n];
}

int main()
{
    cin>>n>>m;
    for (; m--;)
        cin>>x>>y>>z,
        g[x].pb(y),
        g[y].pb(x),
        c[x][y]=z;
    for (;bfs();)
        for (i=0;i<g[n].size();i++)
    {
        int v=g[n][i];
        if (!viz[v] || c[v][n]==f[v][n]) continue;
        fmin=1000000000;
        p[n]=v;
        for (j=n;j!=1;j=p[j])
            fmin=min(fmin,c[p[j]][j]-f[p[j]][j]);
        for (j=n;j!=1;j=p[j])
            f[p[j]][j]+=fmin,
            f[j][p[j]]-=fmin;
        mflow+=fmin;
    }
    cout<<mflow;
    return  0;
}