Pagini recente » Cod sursa (job #138980) | Cod sursa (job #3244879) | Cod sursa (job #1686841) | Cod sursa (job #2976446) | Cod sursa (job #1612466)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define dim 355
#define inf 0x3f3f3f3f
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,i,j,m,source,destination,d[dim],viz[dim],t[dim],cap,sol,minim,u,z,c[dim][dim],f[dim][dim],cost[dim][dim],x,y;
vector<int> v[dim];
queue<int> q;
int BF(){
memset(d,inf,sizeof(d));
viz[source]=1;
d[source]=0;
q.push(source);
while(!q.empty()){
int nod = q.front();
for(int i=0;i<v[nod].size();i++){
int vecin=v[nod][i];
if(c[nod][vecin]>f[nod][vecin] && d[vecin]> d[nod]+cost[nod][vecin]){
d[vecin] = d[nod]+cost[nod][vecin];
t[vecin]=nod;
if(viz[vecin]==0){
q.push(vecin);
viz[vecin]=1;
}
}
}
q.pop();
viz[nod]=0;
}
if(d[destination] == inf){
return 0;
}
return 1;
}
int main(){
fin>>n>>m>>source>>destination;
for(i=1;i<=m;i++){
fin>>x>>y>>cap>>z;
v[x].push_back(y);
v[y].push_back(x);
c[x][y]=cap;
cost[x][y]=z;
cost[y][x]=-z;
}
while(BF()){
u=destination;
minim=inf;
while(t[u]){
if(minim>c[t[u]][u]-f[t[u]][u]){
minim=c[t[u]][u]-f[t[u]][u];
}
u=t[u];
}
u=destination;
while(t[u]){
sol+=minim*cost[t[u]][u];
f[t[u]][u]+=minim;
f[u][t[u]]-=minim;
u=t[u];
}
}
fout<<sol<<"\n";
return 0;}