Pagini recente » Cod sursa (job #1752610) | Cod sursa (job #1350405) | Cod sursa (job #71230) | Cod sursa (job #3203312) | Cod sursa (job #411714)
Cod sursa(job #411714)
#include<stdio.h>
#define INF 10000001
#define Nmx 350
#include<vector>
#include<queue>
using namespace std;
int C[Nmx][Nmx],Cst[Nmx][Nmx],prec[Nmx],F[Nmx][Nmx],viz[Nmx],cost[Nmx],n,m,s,d;
vector<int> G[Nmx];
struct cmp
{
bool operator()(const int &a,const int &b) const
{
cost[a]<cost[b];
}
};
priority_queue< int, vector<int> , cmp > Q;
void citire()
{
scanf("%d%d%d%d",&n,&m,&s,&d);
int x,y,c,z;
for(int i=1;i<=m;++i)
{
scanf("%d%d%d%d",&x,&y,&c,&z);
G[x].push_back(y);
G[y].push_back(x);
C[x][y]=c;
Cst[x][y]=z;
Cst[y][x]=-z;
}
}
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int belmand()
{
vector<int> ::iterator it;
for(int i=1;i<=n;++i)
cost[i]=INF;
cost[s]=0;
Q.push(s);
while(!Q.empty())
{
int nod=Q.top();
Q.pop();
viz[nod]=0;
for(it=G[nod].begin();it!=G[nod].end();++it)
if(cost[*it]>cost[nod]+Cst[nod][*it]&&C[nod][*it]-F[nod][*it]>0)
{
cost[*it]=cost[nod]+Cst[nod][*it];
prec[*it]=nod;
if(!viz[*it])
{
viz[*it]=1;
Q.push(*it);
}
}
}
if(cost[d]<INF)
return 1;
return 0;
}
void solve()
{
int sol=0;
while(belmand())
{
int Vmin=INF;
for(int i=d;i!=s;i=prec[i])
Vmin=min(Vmin,C[prec[i]][i]-F[prec[i]][i]);
for(int i=d;i!=s;i=prec[i])
{
F[prec[i]][i]+=Vmin;
F[i][prec[i]]-=Vmin;
}
sol+=Vmin*cost[d];
}
printf("%d\n",sol);
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
citire();
solve();
return 0;
}