Cod sursa(job #984704)

Utilizator AlexandruValeanuAlexandru Valeanu AlexandruValeanu Data 15 august 2013 09:40:18
Problema Flux maxim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>

using namespace std;

int src,snk,nnode,nedge;
int fin[100000],dist[100000];//nodes
int cap[100000],nextt[100000],to[100000];
void init(int s,int sn,int n)
{
    src=s,snk=sn,nnode=n,nedge=0;
    memset(fin,-1,sizeof(fin));
}
void add(int u,int v,int c)
{
    to[nedge]=v,cap[nedge]=c,nextt[nedge]=fin[u],fin[u]=nedge++;
    to[nedge]=u,cap[nedge]=0,nextt[nedge]=fin[v],fin[v]=nedge++;
}
bool bfs()
{
    int e,u,v;
    memset(dist,-1,sizeof(dist));
    dist[src]=0;
    queue<int> q;
    q.push(src);
    while(!q.empty())
    {
        u=q.front();
        q.pop();
        for(e=fin[u];e>=0;e=nextt[e])
        {
            v=to[e];
            if(cap[e]>0&&dist[v]==-1)
            {
                dist[v]=dist[u]+1;
                q.push(v);
            }
        }
    }
    if(dist[snk]==-1)
        return false;
    else
        return true;
}
int dfs(int u,int flow)
{
    if(u==snk)
        return flow;
    int e,v,df;
    for(e=fin[u];e>=0;e=nextt[e])
    {
        v=to[e];
        if(cap[e]>0&&dist[v]==dist[u]+1)
        {
            df=dfs(v,min(cap[e],flow));
            if(df>0)
            {
                cap[e]-=df;
                cap[e^1]+=df;
                return df;
            }
        }
    }
    return 0;
}
int dinitz()
{
    int ans=0;
    int df,i;
    while(bfs())
    {
        while( df=dfs(src,100000000) )
        {
            if(df>0)
                ans+=df;
        }
    }
    return ans;
}

int main() {

    freopen("maxflow.in", "r", stdin);
    freopen("maxflow.out", "w", stdout);

    int n, e, u, v, c, i;

    scanf("%d%d", &n, &e);

    init(1,n,n);

    for(i=0; i<e; i++) {
        scanf("%d%d%d", &u, &v, &c);
        if(u!=v) add(u, v, c);
        //graph.add_arc(u,v,c);

    }

    printf("%d\n", dinitz());

    return 0;
}