Cod sursa(job #869399)

Utilizator andreas_mihAndreas Mihaloianis andreas_mih Data 1 februarie 2013 16:06:37
Problema Flux maxim de cost minim Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.18 kb
#include<stdio.h>
#include<vector>
#include<queue>
#include<utility>
#include<string.h>
using namespace std;
FILE*in=fopen("fmcm.in","r");
FILE*out=fopen("fmcm.out","w");
queue<int> coada;
int noduri,muchii,sursa,dest,total;
int oldDist[351],dist[351],realDist[351],tata[351];
int flux[351][351], cost[351][351], cap[351][351];
bool bellman();
vector <int> a[351];
int main()
{
    fscanf(in,"%d%d%d%d",&noduri,&muchii,&sursa,&dest);
    for(int i=1;i<=muchii;++i)
    {
        int nod, nodz, capa,c;
        fscanf(in,"%d%d%d%d",&nod,&nodz,&capa,&c);
        a[nod].push_back(nodz);
        a[nodz].push_back(nod);
        cap[nod][nodz]=capa;
        cost[nod][nodz]=c;
        cost[nodz][nod]=-c;

    }
    while(bellman())
    {
        int minim_local=(1<<30)-1;
        for(int i=dest;i!=sursa;i=tata[i])
            minim_local=min(minim_local,cap[tata[i]][i]-flux[tata[i]][i]);
        for(int i=dest;i!=sursa;i=tata[i])
            {
                flux[tata[i]][i]+=minim_local;
                flux[i][tata[i]]-=minim_local;
            }
        total+=minim_local*oldDist[dest];
    }
    fprintf(out,"%d",total);

fclose(in);
fclose(out);
}
bool bellman()
{
    bool inqueue[352];
    memset(inqueue,false,sizeof(inqueue));
    memset(tata,0,sizeof(tata));
     for(int i=1;i<=noduri;++i)
        oldDist[i]=(1<<30)-1;
    oldDist[sursa]=0;
    coada.push(sursa);
    inqueue[sursa]=true;
    while(!coada.empty())
    {
        int nod = coada.front();
        for(int i=0;i<a[nod].size();++i)
        {
            if(a[nod][i] == tata[nod])
                continue;
            if(cap[nod][a[nod][i]]-flux[nod][a[nod][i]] && cap[nod][a[nod][i]] && oldDist[a[nod][i]]>oldDist[nod]+cost[nod][a[nod][i]])
            {
                oldDist[a[nod][i]]=oldDist[nod]+cost[nod][a[nod][i]];
                tata[a[nod][i]]=nod;
                if(!inqueue[a[nod][i]])
                {
                    inqueue[a[nod][i]]=true;
                    coada.push(a[nod][i]);
                }
            }
        }
    inqueue[nod]=false;
    coada.pop();
    }
    if(tata[dest])
        return true;
    else
        return false;
}