Pagini recente » Cod sursa (job #1688488) | Cod sursa (job #2161337) | Cod sursa (job #354312) | Cod sursa (job #500302) | Cod sursa (job #1267675)
#include <fstream>
#include <vector>
#include <queue>
#include <cstring>
#define inf (1<<29)
using namespace std;
ifstream fin ("fmcm.in");
ofstream fout ("fmcm.out");
vector <int> l[355];
priority_queue<pair<int,int>,vector<pair< int,int> >,greater<pair <int, int> > >H;
queue <int> q;
int n,m,C,z,S,D,i,nod,fr,sc,cst,sol,x,y,minim;
int d[355],e[355],r[355],t[355],c[355][355],f[355][355],cost[355][355];
bool viz[355];
void BF () {
q.push(S);
for (i=1;i<=n;i++)
r[i]=inf;
r[S]=0;
while (q.size()) {
nod=q.front();
q.pop();
viz[nod]=0;
for (int i=0;i<l[nod].size();i++) {
fr=l[nod][i]; sc=cost[nod][fr];
if (c[nod][fr]>f[nod][fr] && r[fr]>r[nod]+sc) {
r[fr]=r[nod]+sc;
if (!viz[fr]){
viz[fr]=1;
q.push(fr);
}
}
}
}
}
bool dijkstra () {
// memset(viz,0,sizeof(viz));
for (int i=1;i<=n;i++)
d[i]=inf;
d[S]=e[S]=0;
H.push(make_pair(0,S));
while (!H.empty()) {
while (!H.empty() && viz[H.top().second])
H.pop();
if (H.empty())
break;
nod=H.top().second;
cst=H.top().first;
viz[nod]=1;
d[nod]=cst;
H.pop();
for (int i=0;i<l[nod].size();i++)
if (c[nod][l[nod][i]]>f[nod][l[nod][i]] && d[nod]+cost[nod][l[nod][i]]+r[nod]-r[l[nod][i]]<d[l[nod][i]]) {
H.push(make_pair(d[nod]+cost[nod][l[nod][i]]+r[nod]-r[l[nod][i]],l[nod][i]));
d[l[nod][i]]=d[nod]+cost[nod][l[nod][i]]+r[nod]-r[l[nod][i]];
e[l[nod][i]]=e[nod]+cost[nod][l[nod][i]];
t[l[nod][i]]=nod;
}
}
memcpy(r,e,sizeof(e));
return (d[D]!=inf);
}
int main () {
fin>>n>>m>>S>>D;
for (i=1;i<=m;i++) {
fin>>x>>y>>C>>z;
l[x].push_back(y);
l[y].push_back(x);
c[x][y]=C;
cost[x][y]=z;
cost[y][x]=-z;
}
BF();
while (dijkstra()) {
minim=inf;
for (i=D;i!=S;i=t[i])
minim=min(minim,c[t[i]][i]-f[t[i]][i]);
sol+=minim*r[D];
for (i=D;i!=S;i=t[i]){
f[t[i]][i]+=minim;
f[i][t[i]]-=minim;
}
}
fout<<sol<<"\n";
return 0;
}