Cod sursa(job #252012)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 3 februarie 2009 19:40:11
Problema Flux maxim de cost minim Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
using namespace std;
const int NMAX=351;
int N,M,r[NMAX][NMAX],c[NMAX][NMAX],source,sink;
queue<int> Q;
vector<int> G[NMAX];
ifstream f("fmcm.in");
ofstream g("fmcm.out");
bool ok=true;
int mincost;
int d[NMAX],t[NMAX];
bitset<NMAX> u;
void drum(){
     vector<int>::iterator it;
     int x;
     ok=false;
     mincost=0;
     memset(d,0x3f,sizeof(d));
     memset(t,0,sizeof(t));
     Q.push(source);
     u[source]=1;
     d[source]=0;
     t[source]=source;
     while (!Q.empty()){
       x=Q.front();
       Q.pop();
       u[x]=0;
       for (it=G[x].begin();it!=G[x].end();++it)
        if (r[x][*it]>0)
         if (d[*it]>d[x]+c[x][*it]){
           d[*it]=d[x]+c[x][*it];
           t[*it]=x;
           if (!u[*it]) Q.push(*it),u[*it]=1;
           }
       }
     if (!t[sink]) return;
     ok=true;
     int rmin=2000000000;
     for (x=sink;t[x]!=x;x=t[x])
       rmin=min(rmin,r[t[x]][x]);
     for (x=sink;t[x]!=x;x=t[x])   
       r[t[x]][x]-=rmin,
       r[x][t[x]]+=rmin;
     mincost=d[sink]*rmin;
     }
int solve(){
    int sol=0;
    while (ok){
      drum();
      sol+=mincost;
      }
    return sol;
    }
int main(){
    int i,j,cap,cost;
    f>>N>>M>>source>>sink;
    while (M--){
          f>>i>>j>>cap>>cost;
          G[i].push_back(j);
          G[j].push_back(i);
          r[i][j]=cap;
          c[i][j]=cost;
          c[j][i]=-cost;
          }
    g<<solve();
    return 0;
}