Pagini recente » Cod sursa (job #750683) | Cod sursa (job #1368656) | Cod sursa (job #1291541) | Cod sursa (job #591924) | Cod sursa (job #1119470)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bitset>
#include <cstdio>
#include <vector>
#include <cmath>
#include <queue>
#include <string>
#include <map>
#include <set>
#include <cstring>
#define DN 369
#define pb push_back
#define mp make_pair
#define per pair<int,int>
#define INF (1<<30)
#define LL long long
#define un unsigned
#define x first
#define y second
using namespace std;
int n,m,s,d,dist[DN],C[DN][DN],cost[DN][DN],exista_drum,prev[DN],F[DN][DN];
vector < int > list[DN];
queue < int > q;
bitset< DN > in_q;
int bf(){
for(int i=1;i<=n;++i){
dist[i]=INF;
prev[i]=-1;
}
dist[ s ] = 0;
q.push(s);
in_q[s] = 1;
for( ; q.size() ; ){
int nod = q.front();
q.pop();
in_q[nod] = 0;
for(int i=0;i<list[ nod ].size(); ++i ){
int next_nod = list[nod][i];
if( C[nod][next_nod] - F[nod][next_nod] > 0 && dist[ next_nod ] > dist[nod] + cost[nod][next_nod] ){
dist[ next_nod ] = dist[nod] + cost[nod][next_nod];
prev[ next_nod ] = nod;
if(!in_q[next_nod]){
in_q[next_nod] = 1;
q.push(next_nod);
}
}
}
}
if( dist[ d ] != INF){
int vmin = INF;
exista_drum = 1;
for(int nod = d; nod!=s ; nod = prev[nod] )
vmin = min(vmin,C[prev[nod]][nod] - F[prev[nod]][nod]);
for(int nod = d; nod!=s ; nod = prev[nod] ){
F[prev[nod]][nod]+=vmin;
F[nod][prev[nod]]-=vmin;
}
return vmin * dist[d];
}
return 0;
}
LL flux(){
LL rez = 0;
exista_drum = 1;
for( ; exista_drum ;){
exista_drum = 0;
rez+=bf();
}
return rez;
}
int main()
{
ifstream f("fmcm.in");
ofstream g("fmcm.out");
f>>n>>m>>s>>d;
for(int i=1;i<=m;++i){
int a,b,c,z;
f>>a>>b>>c>>z;
list[a].pb(b);
list[b].pb(a);
C[a][b]=c;
cost[a][b]=z;
cost[b][a]=-z; /// ?
}
g<< flux();
return 0;
}