Pagini recente » Cod sursa (job #2325025) | Rating Vulpe Elisabeta Lucia (17thFox) | Rating serbanescu denisa stefania (XStefiX) | Cod sursa (job #1723982) | Cod sursa (job #1686751)
#include <iostream>
#include <fstream>
#include <vector>
#include <bitset>
#include <algorithm>
#include <queue>
#include <cstring>
#define pb push_back
#define mp make_pair
#define MAXN 355
#define MAXX 0x3f
#define MAX 0x3f3f3f3f
#define INFILE "fmcm.in"
#define OUTFILE "fmcm.out"
using namespace std;
ifstream f(INFILE);
ofstream g(OUTFILE);
int d[MAXN],real_d[MAXN],old_d[MAXN],t[MAXN];
int n,m,s,D,F,FCst;
int C[MAXN][MAXN],cst[MAXN][MAXN];
vector<int> G[MAXN];
bitset<MAXN> inQ;
queue<int> q;
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > H;
void bellman()
{
memset(old_d,MAXX,sizeof(old_d));
old_d[s]=0;
vector<int>::iterator it;
int i;
for(q.push(s),inQ[s]=1;!q.empty();q.pop())
{
i=q.front();
inQ[i]=0;
for(it=G[i].begin();it!=G[i].end();it++)
if(C[i][*it]&&old_d[*it]>old_d[i]+C[i][*it])
{
old_d[*it]=old_d[i]+C[i][*it];
if(!inQ[*it])
q.push(*it),inQ[*it]=1;
}
}
}
inline bool dijkstra()
{
memset(d,MAXX,sizeof(d));
d[s]=0;real_d[s]=0;
H.push(mp(d[s],s));
vector<int>::iterator it;
for(;!H.empty();)
{
int ct=H.top().first,nod=H.top().second;
H.pop();
if(d[nod]!=ct)continue;
for(it=G[nod].begin();it!=G[nod].end();it++)
if(C[nod][*it])
{
int new_d=d[nod]+cst[nod][*it]+old_d[nod]-old_d[*it];
if(new_d<d[*it])
{
d[*it]=new_d;
real_d[*it]=real_d[nod]+cst[nod][*it];
t[*it]=nod;
H.push(mp(d[*it],*it));
}
}
}
memcpy(old_d,real_d,sizeof(d));
if(d[D]==MAX) return false;
int Min=MAX;
for(int aux=D;aux!=s;aux=t[aux])
Min=min(Min,C[t[aux]][aux]);
F+=Min;
FCst+=Min*real_d[D];
for(int aux=D;aux!=s;aux=t[aux])
C[t[aux]][aux]-=Min,
C[aux][t[aux]]+=Min;
return true;
}
int main()
{
f>>n>>m>>s>>D;
int x,y,ct,cap;
while(m--)
{
f>>x>>y>>cap>>ct;
G[x].pb(y);
G[y].pb(x);
cst[x][y]=ct;
cst[y][x]=-ct;
C[x][y]=cap;
}
bellman();
for(;dijkstra(););
g<<FCst;
f.close();
g.close();
return 0;
}