Pagini recente » Cod sursa (job #2478141) | Cod sursa (job #2554559) | Cod sursa (job #1420659) | Cod sursa (job #2834926) | Cod sursa (job #726641)
Cod sursa(job #726641)
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
#define DN 355
#define MULT (1<<30)
#define mp make_pair
#define x first
#define y second
using namespace std;
typedef pair<int,int> per;
typedef vector<per>::iterator it;
int n,m,s,d,dist[DN],pre[DN],cp[DN][DN],rez;
vector<per> gr[DN];
bitset<DN> iq;
class cmp {
public:
inline bool operator()(const int &a,const int &b) {
return dist[a]>dist[b];
}
};
priority_queue<int,vector<int>,cmp > pq;
bool bf() {
iq&=0;
for(int i=1; i<=n; ++i) {
pre[i]=-1;
dist[i]=MULT;
}
pre[s]=dist[s]=0;
for(pq.push(s);pq.size();) {
int fr=pq.top();
pq.pop();
iq[fr]=0;
for(it i=gr[fr].begin();i!=gr[fr].end(); ++i) {
if(i->x==s) continue;
if(cp[fr][i->x]>0 && dist[i->x]>dist[fr]+i->y) {
pre[i->x]=fr;
dist[i->x]=dist[fr]+i->y;
if(!iq[i->x]) {
iq[i->x]=1;
pq.push(i->x);
}
}
}
}
return dist[d]!=MULT;
}
int main()
{
ifstream f("fmcm.in");
ofstream g("fmcm.out");
f>>n>>m>>s>>d;
int cst;
for(int i=1; i<=m; ++i) {
int a,b,c,d;
f>>a>>b>>c>>d;
cp[a][b]=c;
gr[a].push_back(mp(b,d));
gr[b].push_back(mp(a,-d));
}
for(;bf();) {
int cap=MULT,nc;
for(nc=d;pre[nc];nc=pre[nc]) cap=min(cap,cp[pre[nc]][nc]);
for(nc=d;pre[nc];nc=pre[nc]) {
cp[pre[nc]][nc]-=cap;
cp[nc][pre[nc]]+=cap;
}
rez+=cap*dist[d];
}
g<<rez;
return 0;
}