Pagini recente » Cod sursa (job #2047298) | Cod sursa (job #2596798) | Cod sursa (job #685633) | Cod sursa (job #1982630) | Cod sursa (job #2697812)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int N,M,S,D,C[355][355],Cst[355][355],F,FCst,in[355];
vector<int> con[355];
char inQ[355];
const int INF=0x3f3f3f3f;
int d[355],real_d[355],p[355];
int old_d[355];
queue<int> Q;
priority_queue< pair<int,int>, vector<pair< int,int> >, greater<pair<int,int>> > H;
bool dijkstra()
{
memset(d,0x3f,sizeof(d));
d[S]=0;
real_d[S]=0;
H.push(make_pair(d[S],S));
while(!H.empty())
{
int cst=H.top().first, nod=H.top().second;
H.pop();
if(d[nod]!=cst)
continue;
vector<int>::iterator it;
for(it=con[nod].begin();it!=con[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];
p[*it]=nod;
H.push(make_pair(d[*it],*it));
}
}
}
memcpy(old_d,real_d,sizeof(d));
if(d[D]==0x3f3f3f3f)
return false;
int Min=0x3f3f3f3f,curCst=0;
for(int aux=D;aux!=S;aux=p[aux])
{
Min=min(Min,C[p[aux]][aux]);
curCst+=Cst[p[aux]][aux];
}
F+=Min;
FCst+=Min*real_d[D];
for(int aux=D;aux!=S;aux=p[aux])
{
C[p[aux]][aux]-=Min;
C[aux][p[aux]]+=Min;
}
return true;
}
bool bellmanFord()
{
memset(old_d, 0x3f, sizeof(old_d));
old_d[S]=0;
for(Q.push(S),in[S]=1; !Q.empty(); Q.pop())
{
vector<int>::iterator it;
int i = Q.front();
inQ[i]=0;
for(it=con[i].begin();it!=con[i].end();it++)
if(C[i][*it])
{
if(old_d[i]+Cst[i][*it]>=old_d[*it])
continue;
old_d[*it]=old_d[i]+Cst[i][*it];
if(inQ[*it])
continue;
inQ[*it]=1;
Q.push(*it);
}
}
if(old_d[D]==0x3f3f3f3f)
return 0;
return 1;
}
int main()
{
ios_base::sync_with_stdio(false);
fin.tie(0);
fout.tie(0);
fin>>N>>M>>S>>D;
while(M--)
{
int x,y;
fin>>x>>y;
con[x].push_back(y);
con[y].push_back(x);
fin>>C[x][y]>>Cst[x][y];
Cst[y][x]=-Cst[x][y];
}
bellmanFord();
while(dijkstra());
fout<<FCst;
return 0;
}