Pagini recente » Cod sursa (job #1102527) | Cod sursa (job #2328440) | Cod sursa (job #2335689) | Cod sursa (job #683563) | Cod sursa (job #869399)
Cod sursa(job #869399)
#include<stdio.h>
#include<vector>
#include<queue>
#include<utility>
#include<string.h>
using namespace std;
FILE*in=fopen("fmcm.in","r");
FILE*out=fopen("fmcm.out","w");
queue<int> coada;
int noduri,muchii,sursa,dest,total;
int oldDist[351],dist[351],realDist[351],tata[351];
int flux[351][351], cost[351][351], cap[351][351];
bool bellman();
vector <int> a[351];
int main()
{
fscanf(in,"%d%d%d%d",&noduri,&muchii,&sursa,&dest);
for(int i=1;i<=muchii;++i)
{
int nod, nodz, capa,c;
fscanf(in,"%d%d%d%d",&nod,&nodz,&capa,&c);
a[nod].push_back(nodz);
a[nodz].push_back(nod);
cap[nod][nodz]=capa;
cost[nod][nodz]=c;
cost[nodz][nod]=-c;
}
while(bellman())
{
int minim_local=(1<<30)-1;
for(int i=dest;i!=sursa;i=tata[i])
minim_local=min(minim_local,cap[tata[i]][i]-flux[tata[i]][i]);
for(int i=dest;i!=sursa;i=tata[i])
{
flux[tata[i]][i]+=minim_local;
flux[i][tata[i]]-=minim_local;
}
total+=minim_local*oldDist[dest];
}
fprintf(out,"%d",total);
fclose(in);
fclose(out);
}
bool bellman()
{
bool inqueue[352];
memset(inqueue,false,sizeof(inqueue));
memset(tata,0,sizeof(tata));
for(int i=1;i<=noduri;++i)
oldDist[i]=(1<<30)-1;
oldDist[sursa]=0;
coada.push(sursa);
inqueue[sursa]=true;
while(!coada.empty())
{
int nod = coada.front();
for(int i=0;i<a[nod].size();++i)
{
if(a[nod][i] == tata[nod])
continue;
if(cap[nod][a[nod][i]]-flux[nod][a[nod][i]] && cap[nod][a[nod][i]] && oldDist[a[nod][i]]>oldDist[nod]+cost[nod][a[nod][i]])
{
oldDist[a[nod][i]]=oldDist[nod]+cost[nod][a[nod][i]];
tata[a[nod][i]]=nod;
if(!inqueue[a[nod][i]])
{
inqueue[a[nod][i]]=true;
coada.push(a[nod][i]);
}
}
}
inqueue[nod]=false;
coada.pop();
}
if(tata[dest])
return true;
else
return false;
}