Pagini recente » Cod sursa (job #1882581) | Cod sursa (job #3188641) | Cod sursa (job #2909863) | Cod sursa (job #654719) | Cod sursa (job #931197)
Cod sursa(job #931197)
#include<stdio.h>
#include<string.h>
#include<queue>
#include<vector>
using namespace std;
//I consider this problem the most retarded one xD
#define max 355
#define inf 0x3f3f3f3f
int n,m,s,d,C[max][max],Cst[max][max];
vector<int> con[max];
int f,fcst;
int old_d[max];
bool inQ[max];
queue<int>Q;
int D[max],real_d[max],p[max];
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] == inf )
return false;
int Min=inf, cC=0;
for(int i=d;i!=s;i=p[i])
Min=min(Min,C[p[i]][i]), cC+=Cst[p[i]][i];
f+=Min;
fcst+=Min*real_d[d];
for(int i=d;i!=s;i=p[i])
C[p[i]][i] -= Min,
C[i][p[i]] += Min;
return true;
}
void bellman()
{
memset(old_d,0x3f,sizeof(old_d));
old_d[s]=0;
Q.push(s);
inQ[s]=1;
for(;!Q.empty();Q.pop())
{
vector<int>::iterator it;
int x=Q.front();
inQ[x]=0;
for(it = con[x].begin(); it!=con[x].end(); it++)
if(C[x][*it])
{
if(old_d[x]+Cst[x][*it] >= old_d[*it])
continue;
old_d[*it]=old_d[x]+Cst[x][*it];
if(inQ[*it])
continue;
inQ[*it]=1;
Q.push(*it);
}
}
}
int main()
{
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d);
while(m)
{
int x,y;
scanf("%d%d",&x,&y);
con[x].push_back(y);
con[y].push_back(x);
scanf("%d %d",C[x]+y,Cst[x]+y);
Cst[y][x]=-Cst[x][y];
}
f=fcst=0;
bellman();
while(dijkstra());
printf("%d\n",fcst);
return 0;
}