Cod sursa(job #526463)

Utilizator ucc_5Usurelu Catalin ucc_5 Data 28 ianuarie 2011 13:40:19
Problema Flux maxim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.13 kb
#include <fstream>
#include <vector>
#include <queue>

#define nmax 5
#define inf 999999

using namespace std;

ifstream fin("maxflow.in");
ofstream fout("maxflow.out");


int source,sink,flow,n,m,c[nmax][nmax],f[nmax][nmax]; //f[x][y]=flux (x,y), c[x][y]=capacitate (x,y)
int parent[nmax];
vector <int> g[nmax];
bool viz[nmax];

void read ()
{
    int x,y,z,i;
    fin>>n>>m;
    
    source=1; sink=n;  //initializez sursa si destinatia
    
    for (i=1; i<=m; i++)
    {
        fin>>x>>y>>z;
        g[x].push_back (y);
        g[y].push_back (x);
        c[x][y]+=z;  //+= daca sunt mai multe arce
    }
    fin.close ();
}

bool bfs ()
{
    int node,child;
    queue <int> q;
    memset (viz,false,sizeof(viz));
    q.push(source);
    viz[source]=true;
    
    while (!q.empty ())
    {
        node=q.front ();
        q.pop ();
        if (node==sink) 
            continue;
        for (size_t j=0; j<g[node].size (); j++)
        {
            child=g[node][j];
            if (c[node][child]==f[node][child] || viz[child])
                continue;
            viz[child]=true;
            q.push (child);
            parent[child]=node;
        }
    }
    return viz[sink];
}
    

void Edmonds_Karp ()
{
    int node,fmin;
    while (bfs())
        
    {
        for (size_t i=0; i<g[sink].size(); i++)
        {
            node=g[sink][i];
            if (f[node][sink]==c[node][sink] || !viz[node]))
                continue;
            parent[sink]=node;
            
            fmin=inf;
            for (node=sink; node!=source; node=parent[node])
                fmin=min(fmin,c[parent[node]][node]-f[parent[node]][node]);
            
            if (fmin==0) continue;
            
            for (node=sink; node!=source; node=parent[node]);
            {
                f[parent[node]][node]+=fmin;
                f[node][parent[node]]-=fmin;
            }
            
            flow+=fmin;
        }
    }
}

void write ()
{
    fout<<flow;
    fout.close ();
}

int main ()
{
    read ();
    Edmonds_Karp ();
    write ();
    return 0;
}