Cod sursa(job #1070501)

Utilizator dumytruKana Banana dumytru Data 1 ianuarie 2014 13:32:01
Problema Flux maxim Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <stdio.h>
#include <vector>
#include <queue>
using namespace std;
//#include <fstream>
vector<vector<unsigned> >graf;
vector<int>node,from;
queue <unsigned>q;
unsigned n,m,cap[1001][1001],start,sink;

void read()
{
    unsigned u,c,v,i,j;
    //scanf("%u %u %u %u",&n,&m,&start,&sink);
    scanf("%u %u",&n,&m);
    start = 1;sink = n;
    graf.resize(n+1);
    for(i=1;i<=n;i++)graf[i].push_back(0);
    for(i=1;i<=m;i++)
    {
        scanf("%u %u %u",&u,&v,&c);
        graf[u][0]++;
        graf[u].push_back(v);
        cap[u][v]=c;
    }
    node.resize(n+1);
    from.resize(n+1);
    node[start]=-1;
    from[start]=-1;
}
unsigned resolve()
{
    unsigned where,ok=1,i,j;
    while(!q.empty() && ok)
    {
        where=q.front();
        q.pop();
        for(i=1;i<=graf[where][0];i++)
            if(node[graf[where][i]]==0 && cap[where][graf[where][i]]>0)
            {
                q.push(graf[where][i]);
                node[graf[where][i]]=1;
                from[graf[where][i]]=where;
                if(graf[where][i]==sink)
                    ok=0;
            }
    }
    where=sink;
    unsigned path_cap = 1<<30,prev;

    while(from[where] > 0)
    {
        prev = from[where]; // the previous vertex
        path_cap = min(path_cap, cap[prev][where]);
        where = prev;
    }
    where = sink;

    while (from[where] > 0)
    {
        prev = from[where];
        cap[prev][where] -= path_cap;
        cap[where][prev] += path_cap;
        where = prev;
    }

    // if no path is found, path_cap is infinity
    if (path_cap == 1<<30)
        return 0;
    else return path_cap;
}
unsigned max_flow()
{
    while(!q.empty())q.pop();//un an mai tz: nu era mai simplu un clear() ? :|
    q.push(start);
    for(unsigned i=1;i<=n;i++)
    {
        node[i]=0;
        from[i]=0;
    }
    node[start]=from[start]=-1;
    unsigned result=resolve();
    if(result>0)return max_flow()+result;
    return 0;
}
int main()
{
    freopen("maxflow.in","r",stdin);
    freopen("maxflow.out","w",stdout);
    //ofstream g("maxflow.out");
    read();
    //g<<max_flow();
    printf("%u",max_flow());

    return 0;
}