Pagini recente » Profil DenisacheInfo | Istoria paginii utilizator/dcov | Diferente pentru utilizator/tudormaxim intre reviziile 57 si 58 | Istoria paginii runda/prega_agm_grupa1_contest1 | Cod sursa (job #1900539)
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#define DN 360
#define DM 12600
#define inf 99999
using namespace std;
fstream fin("fmcm.in",ios::in),fout("fmcm.out",ios::out);
priority_queue<pair<int,int> > q;
int cp[DN][DN],cs[DN][DN],t[DN],d[DN];
vector<int> v[DN];
int N,M,S,D;
int dijkstra()
{
int nod,cst,f,i;
for(i=0;i<=N;i++) { d[i]=inf; t[i]=0; }
d[S]=0;
q.push({0,S});
while(q.empty()==0)
{
cst=-q.top().first; nod=q.top().second; q.pop();
for(i=0;i<v[nod].size();i++)
{
f=v[nod][i];
if(d[f]>cst+cs[nod][f] && cp[nod][f]>0)
{
d[f]=cst+cs[nod][f];
t[f]=nod;
q.push({-d[f],f});
}
}
}
return d[D];
}
void flux()
{
int i,j,f,cost,minim,r=0;
while(dijkstra()!=inf)
{
cout<<"2";
cout<<"m:"<<d[D]<<"\n";
cout<<"1";
for(i=0;i<v[D].size();i++)
{
f=v[D][i];
if(d[f]!=inf && cp[f][D]>0)
{
f=D; minim=inf; cost=0;
while(f!=S)
{
minim=min(minim,cp[t[f]][f]);
cost+=cs[t[f]][f];
f=t[f];
}
f=D;
while(f!=S)
{
cp[t[f]][f]-=minim;
cp[f][t[f]]+=minim;
f=t[f];
}
r+=minim*cost;
}
}
cout<<"2";
}
cout<<r<<"\n";
}
int main()
{
int a,b,c,i,j,p;
fin>>N>>M>>S>>D;
for(i=1;i<=M;i++)
{
fin>>a>>b>>c>>p;
v[a].push_back(b);
v[b].push_back(a);
cs[a][b]=p;cs[b][a]=p;
cp[a][b]=c;
}
flux();
}