Pagini recente » Cod sursa (job #1344162) | Cod sursa (job #2010391) | Cod sursa (job #87629) | Cod sursa (job #2318580) | Cod sursa (job #2124549)
#include <iostream>
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
#define N 400
#define pb push_back
#define inf 999999999
#define mp make_pair
#define f first
#define s second
int C[N][N],t[N],F[N][N],fm,cm,d[N],i,j,n,m,x,y,S,D,c,z,it,cst[N][N],sel[N],ans;
class cmp
{
public:
bool operator () (int x,int y)
{
return(d[x]<d[y]);
}
};
vector<pair<int,int> >a[N];
priority_queue<int,vector<int>,cmp >pq;
bool dijkstra(int S,int D)
{
int cost;
for(i=0;i<n;++i)
{
sel[i+1]=0;
d[i+1]=inf+1;
t[i+1]=0;
}
d[S]=0;
pq.push(S);
sel[S]=1;
while(!pq.empty())
{
x=pq.top();
pq.pop();
if(x==D)continue;
for(i=0;i<a[x].size();++i)
{
y=a[x][i].f;
cost=a[x][i].s;
if(!sel[y] && C[x][y]>F[x][y] && d[y]>d[x]+cost)
{
t[y]=x;
d[y]=d[x]+cost;
pq.push(y);
}
}
}
if(d[D]>inf)return 0;
return 1;
}
int main()
{
ifstream f("fmcm.in");
f>>n>>m>>S>>D;
for(i=0;i<m;++i)
{
f>>x>>y>>c>>z;
cst[x][y]=z;
cst[y][x]=-z;
C[x][y]=c;
a[x].pb(mp(y,z) );
a[y].pb(mp(x,z) );
}
while(dijkstra(S,D))
{
for(it=0;it<a[D].size();++it)
{
x=a[D][it].f;
if(d[x]>inf||C[x][D]==F[x][D])continue;
t[D]=x;
fm=inf;
for(i=D;i!=S;i=t[i])
fm=min(fm,C[t[i]][i]-F[t[i]][i]);
if(!fm)continue;
for(i=D;i!=S;i=t[i])
{
F[t[i]][i]+=fm;
F[i][t[i]]-=fm;
ans+=fm*cst[t[i]][i];
}
}
}
ofstream g("fmcm.out");
g<<ans;
return 0;
}