Pagini recente » Cod sursa (job #2874996) | Cod sursa (job #1643622) | Cod sursa (job #1929296) | Cod sursa (job #3197926) | Cod sursa (job #1128496)
#include <fstream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
ifstream f("fmcm.in");
ofstream g("fmcm.out");
int csm,ok[355],cost[355][355],pred[355],nd1,d1,nd2,d2,dist[355],pi,pf,n,m,i,j,c,x,y,z,fl[355][355],cst[355][355];
vector<int> b[355];
vector<int> a[355];
queue<int> q;
pair<int,int> per1,per2,rez[355];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > Q;
int cmp(pair<int,int> nr1,pair <int,int> nr2)
{
if(nr1.first>nr2.first)
return 0;
return 1;
}
int main()
{
f>>n>>m>>pi>>pf;
for(i=1;i<=m;i++)
{
f>>x>>y>>c>>z;
a[x].push_back(y);
b[x].push_back(y);
a[y].push_back(x);
fl[x][y]=c;
cst[x][y]=z;
cost[x][y]=z;
cost[y][x]=-z;
}
for(i=1;i<=n+1;i++)
dist[i]=355000;
q.push(pi);
dist[pi]=0;
while(!q.empty())
{
nd1=q.front();
q.pop();
for(vector<int>::iterator it=b[nd1].begin();it!=b[nd1].end();it++)
{
nd2=*it;
if(dist[nd1]+cst[nd1][nd2]<dist[nd2])
{
dist[nd2]=dist[nd1]+cst[nd1][nd2];
q.push(nd2);
}
}
}
for(i=1;i<=n;i++)
{
for(vector<int>::iterator itt=b[i].begin();itt!=b[i].end();itt++)
{
nd1=*itt;
cst[i][nd1]+=(dist[i]-dist[nd1]);
cst[nd1][i]=-cst[i][nd1];
}
}
j=1;
while(j)
{
for(i=1;i<=n;i++)
{
dist[i]=355000;
}
Q.push(pair<int,int>(0,pi));
dist[pi]=0;
pred[pi]=0;
pred[pf]=0;
while(!Q.empty())
{
per1=Q.top();
Q.pop();
nd1=per1.second;
if(!ok[nd1])
{
ok[nd1]++;
for(vector<int>::iterator ii=a[nd1].begin();ii!=a[nd1].end();ii++)
{
nd2=*ii;
if(dist[nd1]+cst[nd1][nd2]<dist[nd2]&&fl[nd1][nd2])
{
dist[nd2]=dist[nd1]+cst[nd1][nd2];
pred[nd2]=nd1;
Q.push(pair<int,int>(dist[nd2],nd2));
}
}
}
}
memset(ok,0,sizeof(ok));
if(!pred[pf])
{
g<<csm<<'\n';
return 0;
}
else
{
x=1;
for(vector<int>::iterator con=a[pf].begin();con!=a[pf].end();con++)
{
y=*con;
if(dist[y]!=355000)
{
rez[x++]=pair<int,int>(dist[y]+cst[y][pf],y);
}
}
x--;
sort(rez+1,rez+x+1,cmp);
y=10001;
x=pf;
while(pred[pf])
{
if(fl[pred[pf]][pf]<y)
y=fl[pred[pf]][pf];
pf=pred[pf];
}
pf=x;
while(pred[x])
{
fl[pred[x]][x]-=y;
fl[x][pred[x]]+=y;
csm+=cost[pred[x]][x]*y;
x=pred[x];
}
}
}
return 0;
}