Pagini recente » Istoria paginii utilizator/anca_coto | Infoarena Monthly 2014 - Solutii Runda 3 | Cod sursa (job #2500969) | Cod sursa (job #2751052) | Cod sursa (job #1400006)
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
int min2(int a,int b){
if(a<b)
return a;
return b;
}
using namespace std;
const int N=350;
const int INF=10000;
class To{
public:
int v,c;
To(){
}
To(int vv,int cc){
v=vv;
c=cc;
}
};
vector<To>g[N+1];
queue<int>q;
int dist[N+1];
bool qd[N+1];
bool vis[N+1];
int father[N+1];
int can[N+1][N+1];
int n,m,s,d,f;
void bellman_ford(){
memset(qd,0,sizeof(qd));
memset(vis,0,sizeof(vis));
memset(father,0,sizeof(father));
vis[s]=true;
q.push(s);
for(int i=1;i<=n;i++)
if(i!=s)
dist[i]=INF*N+1;
while(!q.empty()){
int dad=q.front();
q.pop();
qd[dad]=false;
if(dad==d)
continue;
for(unsigned int i=0;i<g[dad].size();i++){
To son=g[dad][i];
if(dist[dad]+son.c<dist[son.v]&&can[dad][son.v]){
dist[son.v]=dist[dad]+son.c;
father[son.v]=dad;
vis[son.v]=true;
if(!qd[son.v])
q.push(son.v);
qd[son.v]=true;
}
}
}
}
void update(){
int node=d;
f=INF*N+1;
while(node!=s){
f=min2(f,can[father[node]][node]);
node=father[node];
}
node=d;
while(node!=s){
can[father[node]][node]-=f;
can[node][father[node]]+=f;
node=father[node];
}
}
int main(){
freopen("fmcm.in","r",stdin);
freopen("fmcm.out","w",stdout);
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=1;i<=m;i++){
int x,y,z,t;
scanf("%d%d%d%d",&x,&y,&z,&t);
g[x].push_back(To(y,t));
g[y].push_back(To(x,-t));
can[x][y]=z;
}
int cost=0;
while(true){
bellman_ford();
if(!vis[n])
break;
update();
cost+=dist[n]*f;
}
printf("%d",cost);
return 0;
}