Pagini recente » Cod sursa (job #1216300) | Cod sursa (job #1308145) | Cod sursa (job #2523787) | Cod sursa (job #3254092) | Cod sursa (job #1418856)
#include<bits/stdc++.h>
using namespace std;
struct cell
{
int nod,cost;
bool operator <(const cell &e )const
{
return cost>e.cost;
}
};
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
const int oo=1<<30;
const int NMAX=355;
int n,m,S,D,fl[NMAX][NMAX],ad[NMAX][NMAX],c[NMAX][NMAX];
int f[NMAX],dp[NMAX];
vector<int>v[NMAX];
vector<int>::iterator it;
priority_queue<cell>Q;
inline bool DIJKSTRA()
{
int i;
cell aux,kkt;
for (i=1;i<=n;i++) f[i]=dp[i]=oo;
dp[S]=0;
aux.nod=S;aux.cost=0;
Q.push(aux);
while (!Q.empty())
{
aux=Q.top();
Q.pop();
if (aux.nod==D) continue;
if (aux.cost==dp[aux.nod])
{
for (it=v[aux.nod].begin();it!=v[aux.nod].end();it++)
if (dp[*it]>(aux.cost+c[aux.nod][*it]) && ad[aux.nod][*it]<fl[aux.nod][*it])
{
dp[*it]=aux.cost+c[aux.nod][*it];
f[*it]=aux.nod;
kkt.nod=*it;kkt.cost=dp[*it];
Q.push(kkt);
}
}
}
if (f[D]==oo) return 0;
return 1;
}
int main()
{
int i,x,y,w,z,sol,mn;
fin>>n>>m>>S>>D;
for (i=1;i<=m;i++)
{
fin>>x>>y>>w>>z;
fl[x][y]+=w;
c[x][y]=z;c[y][x]=-z;
v[x].push_back(y);
v[y].push_back(x);
}
for (sol=0;DIJKSTRA();)
{
mn=oo;
for (i=D;i!=S;i=f[i])
mn=min(mn,fl[f[i]][i]-ad[f[i]][i]);
for (i=D;i!=S;i=f[i])
{
ad[f[i]][i]+=mn;
ad[i][f[i]]-=mn;
}
sol+=mn*dp[D];
}
fout<<sol<<"\n";
return 0;
}