Pagini recente » Cod sursa (job #1390753) | Cod sursa (job #2163515) | Cod sursa (job #2844007) | Cod sursa (job #2414657) | Cod sursa (job #850981)
Cod sursa(job #850981)
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
const int N = 350;
const int inf = 1000000000;
int n, m, s, d, c[N][N], cost[N][N], flux, costt, odist[N], dist[N], ndist[N], p[N];
queue<int> q;
vector<int> v[N];
bool ver[N];
priority_queue<pair<int, int> > h;
bool dijkstra() {
int i, tt;
for(i = 1; i<=n; ++i)
dist[i] = inf;
dist[s] = 0; ndist[s] = 0;
h.push(pair<int, int>(-dist[s], s));
while(!h.empty()) {
int cst = -h.top().first, nod = h.top().second;
h.pop();
if(dist[nod] != cst)
continue;
for(vector<int>::iterator it = v[nod].begin(); it != v[nod].end(); ++it)
if(c[nod][*it]) {
tt = dist[nod] + cost[nod][*it] + odist[nod] - odist[*it];
if(tt < dist[*it]) {
dist[*it] = tt;
ndist[*it] = ndist[nod] + cost[nod][*it];
p[*it] = nod;
h.push(pair<int, int>(-dist[*it], *it));
}
}
}
for(i = 1; i<=n; ++i)
odist[i] = ndist[i];
if(dist[d] == inf)
return 0;
return 1;
}
void bf() {
int i;
for(i = 1; i <= n; ++i)
odist[i] = inf;
odist[s] = 0;
q.push(s);
ver[s] = 1;
while(!q.empty()) {
int el = q.front();
q.pop();
ver[el] = 0;
for(vector<int>::iterator it = v[el].begin(); it != v[el].end(); ++it)
if(c[el][*it] && odist[el] + cost[el][*it] < odist[*it]) {
odist[*it] = odist[el] + cost[el][*it];
if(!ver[*it]) {
ver[*it] = 1;
q.push(*it);
}
}
}
}
int main() {
int i, a, b, cc, dd, smin, ccost;
freopen("fmcm.in", "r", stdin);
freopen("fmcm.out", "w", stdout);
cin >> n >> m >> s >> d;
for(i = 1; i<=m; ++i) {
scanf("%d%d%d%d", &a, &b, &cc, &dd);
v[a].push_back(b);
v[b].push_back(a);
c[a][b] += cc;
cost[a][b] = dd;
cost[b][a] = -dd;
}
bf();
flux = costt = 0;
while(dijkstra()) {
smin = inf, ccost = 0;
for(i = d; i != s; i = p[i]) {
smin = min(smin, c[p[i]][i]);
ccost += cost[p[i]][i];
}
flux += smin;
costt += smin * ndist[d];
for(i = d; i != s; i = p[i])
c[p[i]][i] -= smin,
c[i][p[i]] += smin;
}
cout << costt;
return 0;
}