Pagini recente » Cod sursa (job #760922) | Cod sursa (job #350583) | Cod sursa (job #211863) | Cod sursa (job #981537) | Cod sursa (job #669305)
Cod sursa(job #669305)
#include <fstream>
#include <vector>
#include <queue>
#define NMAx 356
#define INF (1<<28)
using namespace std;
vector <short> G[NMAx],Cost[NMAx];
queue <short> q;
int n,S,D,color,maxflow,Flux[NMAx][NMAx],dist[NMAx];
int tata[NMAx],in_queue[NMAx];
bool BF() {
int i,nod,vecin;
for(i=1;i<=n;i++)
dist[i]=INF;
color++;
q.push(S);
dist[S]=0;
while(!q.empty()) {
nod=q.front();
in_queue[nod]=false;
q.pop();
for(i=0;i<G[nod].size();i++) {
vecin=G[nod][i];
if(Flux[nod][vecin]>0&&dist[vecin]>dist[nod]+Cost[nod][i]) {
dist[vecin]=dist[nod]+Cost[nod][i];
tata[vecin]=nod;
if(in_queue[vecin]!=color) {
q.push(vecin);
in_queue[vecin]=color;
}
}
}
}
if(dist[D]==INF)
return 0;
return 1;
}
void citire() {
int i,x,y,cap,cost,m;
ifstream in("fmcm.in");
in>>n>>m>>S>>D;
for(i=0;i<m;i++) {
in>>x>>y>>cap>>cost;
G[x].push_back(y);
G[y].push_back(x);
Flux[x][y]=cap;
Cost[x].push_back(cost);
Cost[y].push_back(-cost);
}
in.close();
}
int main() {
int nod,flux;
citire();
while(BF()) {
flux=INF;
for(nod=D;nod!=S;nod=tata[nod])
flux=min(flux,Flux[tata[nod]][nod]);
for(nod=D;nod!=S;nod=tata[nod]) {
Flux[tata[nod]][nod]-=flux;
Flux[nod][tata[nod]]+=flux;
}
maxflow+=flux*dist[D];
}
ofstream out("fmcm.out");
out<<maxflow<<'\n';
out.close();
return 0;
}