Pagini recente » Cod sursa (job #2587544) | Cod sursa (job #2512876) | Cod sursa (job #173354) | Cod sursa (job #1189574) | Cod sursa (job #2187922)
#include <iostream>
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
int N,M,S,D,cap[360][360],cost[360][360],flux[360][360],vDist[360],vTati[360];
vector <int> G[360];
priority_queue <pair<int,int> > pq;
bool bf()
{
memset(vDist,0x3f3f3f3f,sizeof(vDist));
pq.push({0,S});
vTati[S]=S;
vDist[S]=0;
int dist,nod;
while(!pq.empty())
{
nod=pq.top().second;
dist=-pq.top().first;
pq.pop();
if(nod==D||vDist[nod]!=dist)
continue;
for(auto fiu:G[nod])
{
if(vDist[fiu]>vDist[nod]+cost[nod][fiu]&&
cap[nod][fiu]>flux[nod][fiu])
{
vTati[fiu]=nod;
vDist[fiu]=vDist[nod]+cost[nod][fiu];
pq.push({-vDist[fiu],fiu});
}
}
}
return vDist[D]!=0x3f3f3f3f;
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&N,&M,&S,&D);
int nod1,nod2,c1,c2,rasp=0;
for(int i=1; i<=M; i++)
{
scanf("%d%d%d%d",&nod1,&nod2,&c1,&c2);
G[nod1].push_back(nod2);
G[nod2].push_back(nod1);
cap[nod1][nod2]=c1;
cost[nod1][nod2]=c2;
cost[nod2][nod1]=-c2;
}
while(bf())
{
int f=0x3f3f3f3f;
for(int nod=D; nod!=S; nod=vTati[nod])
{
f=min(f,cap[vTati[nod]][nod]-flux[vTati[nod]][nod]);
}
for(int nod=D; nod!=S; nod=vTati[nod])
{
flux[vTati[nod]][nod]+=f;
flux[nod][vTati[nod]]-=f;
}
rasp+=f*vDist[D];
}
printf("%d",rasp);
return 0;
}