Pagini recente » Cod sursa (job #596520) | Istoria paginii runda/simulare-40-2/clasament | Statistici Vodita Stefan (QQQ1911) | Istoria paginii runda/fireball3/clasament | Cod sursa (job #2469830)
#include <fstream>
#include <vector>
#include <bitset>
#include <deque>
#include <climits>
#include <cstring>
using namespace std;
ifstream fin("fmcm.in");
ofstream fout("fmcm.out");
int n,m,nod,vec,i,j,c[353][353],flux[353][353],z[353][353],s,d,sol,t[353],ok,C,Z;
vector <int> l[353];
bool f[353] ;
int D[353];
deque <int> q;
bool bell(){
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
D[i]=10000000;
D[s]=0;
f[s]=1;
q.push_back(s);
ok=0;
while(!q.empty()){
nod=q.front();
f[nod]=0;
q.pop_front();
if(nod==d)
ok=1;
for(i=0;i<l[nod].size();i++){
vec=l[nod][i];
if(c[nod][vec]>flux[nod][vec] && D[vec]>D[nod]+z[nod][vec]){
D[vec]=D[nod]+z[nod][vec];
t[vec]=nod;
if(!f[vec]){
f[vec]=1;
q.push_back(vec);
}
}
}
}
return ok;
}
int main(){
fin>>n>>m>>s>>d;
for(;m;m--){
fin>>i>>j;
fin>>c[i][j]>>z[i][j];
z[j][i]=-z[i][j];
l[i].push_back(j);
l[j].push_back(i);
}
while(bell()){
nod=d;
m=10000000;
while(nod!=s){
m=min(m,c[t[nod]][nod]-flux[t[nod]][nod]);
nod=t[nod];
}
nod=d;
while(nod!=s){
flux[t[nod]][nod]+=m;
flux[nod][t[nod]]-=m;
nod=t[nod];
}
sol+=m*D[d];
}
fout<<sol;
return 0;
}