Pagini recente » Cod sursa (job #1056752) | Cod sursa (job #1144795) | Cod sursa (job #614913) | Cod sursa (job #1563120) | Cod sursa (job #301721)
Cod sursa(job #301721)
#include<stdio.h>
#include<string>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
FILE*fin=fopen("fmcm.in","r");
FILE*fout=fopen("fmcm.out","w");
#define inf 1000000000
#define nm 500
#define min(a,b)((a)<(b)?(a):(b))
#define pb push_back
int n,m,s,d,dmin[nm],t[nm],cap[nm][nm],flow[nm][nm],cost[nm][nm];
char inside[nm];
long long ans=0;
vector<int> g[nm];
queue<int> q;
int is_drum()
{
int i,nod,nnod,fl_crt;
for(i=1;i<=n;i++)
{
inside[i]=0;
dmin[i]=inf;
}
inside[s]=1;
dmin[s]=0;
q.push(s);
while(!q.empty())
{
nod=q.front();
q.pop();
inside[nod]=0;
for(i=0;i<g[nod].size();i++)
{
nnod=g[nod][i];
if(cap[nod][nnod]-flow[nod][nnod])
if(dmin[nnod]>dmin[nod]+cost[nod][nnod])
{
dmin[nnod]=dmin[nod]+cost[nod][nnod];
t[nnod]=nod;
if(!inside[nnod])
{
q.push(nnod);
inside[nnod]=1;
}
}
}
}
if(dmin[d]==inf) return 0;
fl_crt=inf;
nod=d;
while(nod!=s)
{
fl_crt=min(fl_crt,cap[t[nod]][nod]-flow[t[nod]][nod]);
nod=t[nod];
}
ans+=(long long)fl_crt*(long long)(dmin[d]);
nod=d;
while(nod!=s)
{
flow[t[nod]][nod]+=fl_crt;
flow[nod][t[nod]]-=fl_crt;
nod=t[nod];
}
return 1;
}
int main()
{
int a,b,capac,c,i;
memset(cap,0,sizeof(cap));
memset(flow,0,sizeof(flow));
fscanf(fin,"%d%d%d%d",&n,&m,&s,&d);
for(i=1;i<=m;i++)
{
fscanf(fin,"%d%d%d%d",&a,&b,&capac,&c);
g[a].pb(b);
g[b].pb(a);
cap[a][b]=capac;
cost[a][b]=c;
cost[b][a]=-c;
}
while(is_drum());
fprintf(fout,"%lld",ans);
fclose(fin);
fclose(fout);
return 0;
}