Pagini recente » Cod sursa (job #2610792) | Cod sursa (job #2741551) | Cod sursa (job #2355390) | Cod sursa (job #2550562) | Cod sursa (job #2128596)
# include <fstream>
# include <vector>
# include <queue>
# include <set>
# include <cstring>
# define DIM 355
# define INF 1000000000
# define f first
# define s second
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
vector<pair<int,int> > Lista[DIM];
queue<int> q;
multiset<pair<int,int> > myset;
multiset<pair<int,int> >::iterator it;
int c[DIM][DIM],f[DIM][DIM],ct[DIM][DIM];
int Marcat[DIM],d[DIM],val[DIM],t[DIM],aux[DIM];
int n,m,nc,nv,i,j,sursa,destinatie,cost,flux,x,y,dif,sol;
void bellmanford(){
for(int i=1;i<=n;i++)
val[i]=INF;
val[sursa]=0;
q.push(sursa);
while(!q.empty()){
nc=q.front();
q.pop();
Marcat[nc]=0;
for(int i=0;i<Lista[nc].size();i++){
nv=Lista[nc][i].f;
cost=Lista[nc][i].s;
if(c[nc][nv]!=0&&val[nv]>val[nc]+cost){
val[nv]=val[nc]+cost;
if(Marcat[nv]==0){
Marcat[nv]=1;
q.push(nv);
}
}
}
}
}
bool fmcm(){
for(int i=1;i<=n;i++)
if(i!=sursa){
d[i]=INF;
aux[i]=INF;
}
myset.insert(make_pair(0,sursa));
while(!myset.empty()){
it=myset.begin();
nc=it->s;
int j=it->f;
myset.erase(it);
if(j!=d[nc])
continue;
for(int i=0;i<Lista[nc].size();i++){
nv=Lista[nc][i].f;
cost=Lista[nc][i].s;
if(d[nv]>d[nc]+cost+val[nc]-val[nv]&&f[nc][nv]<c[nc][nv]){
d[nv]=d[nc]+cost+val[nc]-val[nv];
aux[nv]=aux[nc]+cost;
myset.insert(make_pair(d[nv],nv));
t[nv]=nc;
}
}
}
memcpy(val,aux,sizeof(aux));
if(d[destinatie]==INF)
return 0;
return 1;
}
int main () {
fin>>n>>m>>sursa>>destinatie;
for(i=1;i<=m;i++){
fin>>x>>y>>flux>>cost;
Lista[x].push_back(make_pair(y,cost));
Lista[y].push_back(make_pair(x,-cost));
ct[x][y]=cost;
ct[y][x]=-cost;
c[x][y]=flux;
}
bellmanford();
while(fmcm()){
nv=destinatie;
dif=INF;
for(x=nv;t[x]!=0;x=t[x])
dif=min(dif,c[t[x]][x]-f[t[x]][x]);
for(x=nv;t[x]!=0;x=t[x]){
f[t[x]][x]+=dif;
f[x][t[x]]-=dif;
}
sol+=val[destinatie]*dif;
}
fout<<sol<<"\n";
return 0;
}