Pagini recente » Cod sursa (job #798041) | Cod sursa (job #2135494) | Cod sursa (job #1194039) | Cod sursa (job #757252) | Cod sursa (job #1534992)
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
const int MAXN=350,INF=2000000000;
FILE* f = fopen("fmcm.in","r");
FILE* h = fopen("fmcm.out","w");
int N, M;
vector<int> graf[1 + MAXN];
int S, D;
int capacitate[1 + MAXN][1 + MAXN];
int cost[1+MAXN][1+MAXN];
int flux[1 + MAXN][1 + MAXN];
struct Nod {
int index, cost;
const bool operator < (const Nod &b) const {
return this->cost < b.cost;
}
};
queue<Nod> q;
int fost[1 + MAXN];
int distanta[1 + MAXN];
int fluxtotal,costtotal;
bool bellmanFord(){
memset(fost,0,sizeof(fost));
memset(distanta,0x3f,sizeof(distanta));
q.push(Nod({S, 0}));
fost[S]=S;
distanta[S]=0;
while ( !q.empty() ){
int nod=q.front().index;
int costcurent=q.front().cost;
q.pop();
if (distanta[nod] == costcurent) {
for ( int i=0;i<(int)graf[nod].size();++i ){
int vecin=graf[nod][i];
if (costcurent+cost[nod][vecin] < distanta[vecin]&&capacitate[nod][vecin]-flux[nod][vecin] > 0){
q.push(Nod{vecin,(costcurent+cost[nod][vecin])});
distanta[vecin] = costcurent+cost[nod][vecin];
fost[vecin] = nod;
}
}
}
}
return fost[D] > 0;
}
int main(void) {
int i;
fscanf(f,"%d%d%d%d", &N, &M, &S, &D);
for (i = 0; i < M; ++i) {
int x, y, fl, co;
fscanf(f,"%d%d%d%d", &x, &y, &fl, &co);
graf[x].push_back(y);
capacitate[x][y] = fl;
cost[x][y]=co;
cost[y][x]=-co;
}
while ( bellmanFord() ){
int nod=D;
int mincapacitate = INF;
while (nod != fost[nod]){
if (capacitate[fost[nod]][nod]-flux[fost[nod]][nod] < mincapacitate)
mincapacitate = capacitate[fost[nod]][nod]-flux[fost[nod]][nod];
nod = fost[nod];
}
nod=D;
while (nod != fost[nod]){
flux[fost[nod]][nod] += mincapacitate;
flux[nod][fost[nod]] -= mincapacitate;
nod=fost[nod];
}
}
for ( int i=1;i<=N;++i ){
fluxtotal+=flux[S][i];
}
for ( int i=1;i<=N;++i ){
for ( int j=1;j<=N;++j ){
if ( flux[i][j]>0 )
costtotal+=flux[i][j]*cost[i][j];
}
}
//fprintf(h,"%d\n", fluxtotal);
fprintf(h,"%d\n", costtotal);
return 0;
}