Cod sursa(job #1162517)

Utilizator dumytruKana Banana dumytru Data 31 martie 2014 21:00:25
Problema Flux maxim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <fstream>
#include <vector>
#include <queue>

#define nmax 1001

using namespace std;

vector<vector<int> > graf;
vector<int> path;
queue<int>q;
unsigned n,m,source,sink,oo=1<<20,from[nmax],to[nmax],cap[nmax][nmax];
unsigned minim(unsigned a, unsigned b)
{
    if(a>b)return b;
    return a;
}
unsigned findpath()
{
    unsigned CN,i,ln,minCap=oo;
    bool isPath;
    q.push(source);
    isPath=false;
    while(!q.empty())
    {
        CN=q.front();q.pop();
        ln=graf[CN].size();
        for(i=0;i<ln;i++)
        {
            if( cap[CN][ graf[CN][i] ] )
            {
                minCap=minim(minCap,cap[CN][ graf[CN][i] ]);
                from[graf[CN][i]] = CN;
                if(graf[CN][i]==sink){isPath=true;break;}
                q.push(graf[CN][i]);
            }
        }
    }
    if(!isPath)return 0;
    CN=sink;
    while(CN!=source)
    {
        cap[from[CN]][CN]-=minCap;
        CN=from[CN];
    }
    return minCap;
}
unsigned maxflow()
{
    unsigned r=0,res=0;
    do
    {
        res=findpath();
        r+=res;
    }while(res);
    return r;
}

int main()
{
    ifstream f("maxflow.in");
    ofstream g("maxflow.out");
    unsigned i,u,v,c;
    f>>n>>m;
    graf.resize(n+1);
    for(i=1;i<=m;i++)
    {
        f>>u>>v>>c;
        graf[u].push_back(v);
        cap[u][v]=c;
    }
    source=1;sink=n;
    g<<maxflow();
    return 0;
}