Cod sursa(job #1400006)

Utilizator mihail.jianuJianu Mihail mihail.jianu Data 25 martie 2015 01:05:00
Problema Flux maxim de cost minim Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
int min2(int a,int b){
    if(a<b)
        return a;
    return b;
}
using namespace std;
const int N=350;
const int INF=10000;
class To{
    public:
        int v,c;
        To(){
        }
        To(int vv,int cc){
            v=vv;
            c=cc;
        }
};
vector<To>g[N+1];
queue<int>q;
int dist[N+1];
bool qd[N+1];
bool vis[N+1];
int father[N+1];
int can[N+1][N+1];
int n,m,s,d,f;
void bellman_ford(){
    memset(qd,0,sizeof(qd));
    memset(vis,0,sizeof(vis));
    memset(father,0,sizeof(father));
    vis[s]=true;
    q.push(s);
    for(int i=1;i<=n;i++)
        if(i!=s)
            dist[i]=INF*N+1;
    while(!q.empty()){
        int dad=q.front();
        q.pop();
        qd[dad]=false;
        if(dad==d)
            continue;
        for(unsigned int i=0;i<g[dad].size();i++){
            To son=g[dad][i];
            if(dist[dad]+son.c<dist[son.v]&&can[dad][son.v]){
                dist[son.v]=dist[dad]+son.c;
                father[son.v]=dad;
                vis[son.v]=true;
                if(!qd[son.v])
                    q.push(son.v);
                qd[son.v]=true;
            }
        }
    }
}
void update(){
    int node=d;
    f=INF*N+1;
    while(node!=s){
        f=min2(f,can[father[node]][node]);
        node=father[node];
    }
    node=d;
    while(node!=s){
        can[father[node]][node]-=f;
        can[node][father[node]]+=f;
        node=father[node];
    }
}
int main(){
    freopen("fmcm.in","r",stdin);
    freopen("fmcm.out","w",stdout);
    scanf("%d%d%d%d",&n,&m,&s,&d);
    for(int i=1;i<=m;i++){
        int x,y,z,t;
        scanf("%d%d%d%d",&x,&y,&z,&t);
        g[x].push_back(To(y,t));
        g[y].push_back(To(x,-t));
        can[x][y]=z;
    }
    int cost=0;
    while(true){
        bellman_ford();
        if(!vis[n])
            break;
        update();
        cost+=dist[n]*f;
    }
    printf("%d",cost);
    return 0;
}