Pagini recente » Cod sursa (job #730043) | Cod sursa (job #2568543) | Cod sursa (job #772664) | Cod sursa (job #1572349) | Cod sursa (job #1224721)
#include <fstream>
#include <algorithm>
#include <bitset>
#include <queue>
#define NMAX 355
#define VALMAX 10005
#define inf (NMAX*VALMAX)
using namespace std;
int n,s,t;
int cap[NMAX][NMAX];
int cost[NMAX][NMAX];
int dist[NMAX];
int tata[NMAX];
queue<int> coada;
bitset<NMAX> viz;
inline bool bellman(){
for(int i=1;i<=n;i++)
dist[i]=inf;
dist[s]=0;
coada.push(s);
viz[s]=1;
int i,y;
while(!coada.empty()){
y=coada.front();
coada.pop();
viz[y]=0;
for(i=1;i<=n;i++)
if(cap[y][i])
if(dist[y]+cost[y][i]<dist[i]){
dist[i]=dist[y]+cost[y][i];
tata[i]=y;
if(!viz[i]){
coada.push(i);
viz[i]=1;
}
}
}
return (dist[t]<inf);
}
inline long long int mincost_maxflow(){
long long int mincost=0;
while(bellman()){
int minim=inf;
int nod=t;
while(tata[nod]){
minim=min(minim,cap[tata[nod]][nod]);
nod=tata[nod];
}
nod=t;
while(tata[nod]){
cap[tata[nod]][nod]-=minim;
cap[nod][tata[nod]]+=minim;
nod=tata[nod];
}
mincost+=(1ll*dist[t]*minim);
}
return mincost;
}
int main()
{
ifstream cin("fmcm.in");
ofstream cout("fmcm.out");
int m=0;
cin>>n>>m>>s>>t;
int a,b,c,z;
while(m--){
cin>>a>>b>>c>>z;
cap[a][b]=c;
cost[a][b]=z;
cost[b][a]=-z;
}
cout<<mincost_maxflow()<<'\n';
cin.close();
cout.close();
return 0;
}