Cod sursa(job #1825798)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 9 decembrie 2016 17:30:11
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <cstdio>
#include <vector>
#include <cstring>
#include <cctype>
#define MAXN 350
#define INF 1000000000
#define MAXQ (1<<18)
std::vector <int> G[MAXN+1];
int cap[MAXN+1][MAXN+1];
int cost[MAXN+1][MAXN+1];
int flux[MAXN+1][MAXN+1];
int from[MAXN+1];
bool inQ[MAXN+1];
int dist[MAXN+1];
int q[MAXQ];
inline int BF(int S,int D,int n){
    int b,e,i,x,nod;
    for(i=1;i<=n;i++)
      dist[i]=INF;
    memset(from,0,sizeof(from));
    dist[S]=0;
    inQ[S]=1;
    b=0;
    e=1;
    q[b]=S;
    while(b!=e){
        nod=q[b];
        inQ[nod]=0;
        for(auto x:G[nod])
          if(dist[x]>dist[nod]+cost[nod][x]&&cap[nod][x]>flux[nod][x]){
             dist[x]=dist[nod]+cost[nod][x];
             from[x]=nod;
             if(inQ[x]==0){
                inQ[x]=1;
                q[e]=x;
                e++;
                e&=(MAXQ-1);
             }
          }
        b++;
        b&=(MAXQ-1);
    }
    return dist[D];
}
int main(){
    FILE*fi,*fout;
    int n,m,S,D,nod,ans,min,x,y,z,c,i;
    fi=fopen("fmcm.in" ,"r");
    fout=fopen("fmcm.out" ,"w");
    fscanf(fi,"%d %d %d %d " ,&n,&m,&S,&D);
    for(i=1;i<=m;i++){
        fscanf(fi,"%d %d %d %d " ,&x,&y,&c,&z);
        G[x].push_back(y);
        G[y].push_back(x);
        cap[x][y]=c;
        cost[x][y]=z;
        cost[y][x]=-z;
    }
    ans=0;
    while(BF(S,D,n)<INF){
        nod=D;
        min=INF;
        while(from[nod]>0){
            if(min>cap[from[nod]][nod]-flux[from[nod]][nod])
              min=cap[from[nod]][nod]-flux[from[nod]][nod];
            nod=from[nod];
        }
        nod=D;
        while(from[nod]>0){
            flux[from[nod]][nod]+=min;
            flux[nod][from[nod]]-=min;
            nod=from[nod];
        }
        ans+=min*dist[D];
    }
    fprintf(fout,"%d" ,ans);
    fclose(fi);
    fclose(fout);
    return 0;
}