Pagini recente » Profil HertaTabita | Cod sursa (job #1447588) | Cod sursa (job #252039) | Cod sursa (job #837259) | Cod sursa (job #1224722)
#include <fstream>
#include <algorithm>
#include <vector>
#include <bitset>
#include <queue>
#define NMAX 355
#define VALMAX 10005
#define inf (NMAX*VALMAX)
using namespace std;
int n,s,t;
vector<int> graf[NMAX];
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 y;
vector<int>::iterator it;
while(!coada.empty()){
y=coada.front();
coada.pop();
viz[y]=0;
for(it=graf[y].begin();it!=graf[y].end();it++)
if(cap[y][*it])
if(dist[y]+cost[y][*it]<dist[*it]){
dist[*it]=dist[y]+cost[y][*it];
tata[*it]=y;
if(!viz[*it]){
coada.push(*it);
viz[*it]=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;
graf[a].push_back(b);
graf[b].push_back(a);
cap[a][b]=c;
cost[a][b]=z;
cost[b][a]=-z;
}
cout<<mincost_maxflow()<<'\n';
cin.close();
cout.close();
return 0;
}