Pagini recente » Cod sursa (job #1427175) | Cod sursa (job #855261) | Cod sursa (job #2065698) | Cod sursa (job #440766) | Cod sursa (job #702643)
Cod sursa(job #702643)
#include <queue>
#include <fstream>
#include<vector>
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
using namespace std;
vector<pair<int,pair<int,int> > > v[352];
priority_queue<pair<int,pair<int,int> >,vector<pair<int,pair<int,int> > >,greater<pair<int,pair<int,int> > > > q;
int i,j,n,m,x,y,c,a[352][352],co[352][352],viz[352],s,d,tata[352],cost[352],flux,rez;
bool dij()
{for(i=1;i<=n;i++)
{cost[i]=1<<28;
viz[i]=false;}
viz[s]=true;
cost[s]=0;
for(i=1;i<=n;i++)
for(j=0;j<v[i].size();j++)
v[i][j].first=co[i][v[i][j].second.first];
for(i=0;i<v[s].size();i++)
if(a[s][v[s][i].second.first])
{q.push(v[s][i]);
cost[v[s][i].second.first]=v[s][i].first;}
while(!q.empty())
{
y=q.top().second.first;
x=q.top().second.second;
q.pop();
tata[y]=x;
for(i=0;i<v[y].size();i++)
{
if(a[y][v[y][i].second.first]&&cost[v[y][i].second.first]>cost[y]+v[y][i].first)
{cost[v[y][i].second.first]=v[y][i].first+cost[y];
if(viz[v[y][i].second.first]==false)
{v[y][i].first+=cost[y];
q.push(v[y][i]);
}
}
}
viz[y]=true;
}
if(cost[d]!=1<<28)
return true;
else
return false;
}
int main ()
{ifstream f("fmcm.in");
ofstream g("fmcm.out");
f>>n>>m>>s>>d;
while(m)
{
f>>x>>y;
f>>a[x][y];
f>>c;
co[x][y]=c;
co[y][x]=-c;
v[x].pb(mp(c,mp(y,x)));
v[y].pb(mp(-c,mp(x,y)));
m--;
}
for(rez=0;dij();rez+=c)
{
x=d; flux=20000; c=0;
while(tata[x])
{
if(a[tata[x]][x]<flux) flux=a[tata[x]][x];
x=tata[x];
}
x=d;
while(tata[x])
{ a[tata[x]][x]-=flux;
a[x][tata[x]]+=flux;
c+=flux*co[tata[x]][x];
x=tata[x];
}
}
g<<rez;
f.close(); g.close();
return 0;
}