Pagini recente » Cod sursa (job #1059366) | Cod sursa (job #624558) | Cod sursa (job #272178) | Cod sursa (job #182012) | Cod sursa (job #252012)
Cod sursa(job #252012)
#include <fstream>
#include <queue>
#include <vector>
#include <bitset>
using namespace std;
const int NMAX=351;
int N,M,r[NMAX][NMAX],c[NMAX][NMAX],source,sink;
queue<int> Q;
vector<int> G[NMAX];
ifstream f("fmcm.in");
ofstream g("fmcm.out");
bool ok=true;
int mincost;
int d[NMAX],t[NMAX];
bitset<NMAX> u;
void drum(){
vector<int>::iterator it;
int x;
ok=false;
mincost=0;
memset(d,0x3f,sizeof(d));
memset(t,0,sizeof(t));
Q.push(source);
u[source]=1;
d[source]=0;
t[source]=source;
while (!Q.empty()){
x=Q.front();
Q.pop();
u[x]=0;
for (it=G[x].begin();it!=G[x].end();++it)
if (r[x][*it]>0)
if (d[*it]>d[x]+c[x][*it]){
d[*it]=d[x]+c[x][*it];
t[*it]=x;
if (!u[*it]) Q.push(*it),u[*it]=1;
}
}
if (!t[sink]) return;
ok=true;
int rmin=2000000000;
for (x=sink;t[x]!=x;x=t[x])
rmin=min(rmin,r[t[x]][x]);
for (x=sink;t[x]!=x;x=t[x])
r[t[x]][x]-=rmin,
r[x][t[x]]+=rmin;
mincost=d[sink]*rmin;
}
int solve(){
int sol=0;
while (ok){
drum();
sol+=mincost;
}
return sol;
}
int main(){
int i,j,cap,cost;
f>>N>>M>>source>>sink;
while (M--){
f>>i>>j>>cap>>cost;
G[i].push_back(j);
G[j].push_back(i);
r[i][j]=cap;
c[i][j]=cost;
c[j][i]=-cost;
}
g<<solve();
return 0;
}