Pagini recente » Cod sursa (job #2390773) | Cod sursa (job #3169083) | Cod sursa (job #2580382) | Cod sursa (job #919474) | Cod sursa (job #1534999)
#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;
int 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({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){
distanta[vecin] = costcurent+cost[nod][vecin];
q.push({vecin, distanta[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);
graf[y].push_back(x);
capacitate[x][y] = fl;
capacitate[y][x] = 0;
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;
}