Pagini recente » Cod sursa (job #2275822) | Cod sursa (job #2960422) | Cod sursa (job #809212) | Cod sursa (job #840117) | Cod sursa (job #1094058)
#include<stdio.h>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;
FILE *in,*out;
//definitii
#define pb push_back
//functii
bool bellman(int *destDist);
//constante
const int Nmax=351;
const int oo=0x3f3f3f3f;
//variabile
int noduri,muchii,sursa,dest;
int nod1,nod2,cap,rcost;
vector<int> graf[Nmax];
int emptySpace[Nmax][Nmax],cost[Nmax][Nmax];
bool inQueue[Nmax];
int tata[Nmax],dist[Nmax];
int minflow,node,maxflow;
int main(void)
{
in=fopen("fmcm.in","rt");
out=fopen("fmcm.out","wt");
fscanf(in,"%d%d%d%d",&noduri,&muchii,&sursa,&dest);
while(muchii--)
{
fscanf(in,"%d%d%d%d",&nod1,&nod2,&cap,&rcost);
graf[nod1].pb(nod2);
graf[nod2].pb(nod1);
emptySpace[nod1][nod2]=cap;
cost[nod1][nod2]=rcost;
cost[nod2][nod1]=-rcost;
}
int dist;
while(bellman(&dist))
{
int minflow=oo;
for(node=dest ; node!=sursa ; node=tata[node])
minflow=min(minflow,emptySpace[tata[node]][node]);
for(node=dest ; node!=sursa ; node=tata[node])
{
emptySpace[tata[node]][node]-=minflow;
emptySpace[node][tata[node]]+=minflow;
}
maxflow+=dist*minflow;
}
fprintf(out,"%d",maxflow);
fclose(in);
fclose(out);
return 0;
}
bool bellman(int *destDist)
{
memset(dist,oo,sizeof(dist));
memset(tata,0,sizeof(tata));
memset(inQueue,false,sizeof(inQueue));
dist[sursa]=0;
tata[sursa]=-1;
queue<int> q;
q.push(sursa);
inQueue[sursa]=true;
while(!q.empty())
{
int curent=q.front();
q.pop();
inQueue[curent]=false;
vector<int> :: iterator it,end=graf[curent].end();
for(it=graf[curent].begin() ; it!=end ; ++it)
{
if(!emptySpace[curent][*it])
continue;
if(dist[*it] <= dist[curent]+cost[curent][*it])
continue;
tata[*it]=curent;
dist[*it]=dist[curent]+cost[curent][*it];
if(!inQueue[*it])
{
q.push(*it);
inQueue[*it]=true;
}
}
}
*destDist=dist[dest];
if(tata[dest])
return true;
return false;
}