Pagini recente » Istoria paginii runda/17 | Cod sursa (job #2363940) | Istoria paginii runda/iconcurs8/clasament | Istoria paginii runda/pixel_cup/clasament | Cod sursa (job #597946)
Cod sursa(job #597946)
#include <stdio.h>
#include <string.h>
#include <vector>
#include <queue>
#include <algorithm>
#define NMax 400
#define INF 0x3f3f3f3f
using namespace std;
const char IN[]="fmcm.in",OUT[]="fmcm.out";
int N,M,S,D;
int C[NMax][NMax] , F[NMax][NMax] , Cost[NMax][NMax] , T[NMax] , P[NMax];
bool visit[NMax];
vector<int> ad[NMax];
struct cmp{
bool operator()(int a,int b){
return T[a]<T[b];
}
};
priority_queue< int , vector<int> , cmp > qu;
int Dijkstra()
{
int x;
qu.push(S);
memset(visit,0,sizeof(visit));
memset(T,0x3f,sizeof(T));
T[S]=0;
while (!qu.empty())
{
x=qu.top();qu.pop();
for (vector<int>::iterator it=ad[x].begin();it<ad[x].end();++it)
if (C[x][*it]>F[x][*it] && T[x]+Cost[x][*it]<T[*it])
{
T[*it]=T[x]+Cost[x][*it];P[*it]=x;
if (!visit[*it])
qu.push(*it),visit[*it]=true;
}
}
return T[D]!=INF;
}
int flux()
{
int ret=0,i;
while (Dijkstra())
{
int Fmin=INF;
for (i=D;i!=S;i=P[i])
Fmin=min(Fmin,C[P[i]][i]-F[P[i]][i]);
for (i=D;i!=S;i=P[i])
F[P[i]][i]+=Fmin,
F[i][P[i]]-=Fmin;
ret+= Fmin*T[D];
}
return ret;
}
int main()
{
int x,y,c,z;
freopen(IN,"r",stdin);
scanf("%d%d%d%d",&N,&M,&S,&D);
while (M--)
{
scanf("%d%d%d%d",&x,&y,&c,&z);
ad[x].push_back(y);
ad[y].push_back(x);
Cost[x][y]=z;
Cost[y][x]=-z;
C[x][y]=c;C[y][x]=c;
}
fclose(stdin);
freopen(OUT,"w",stdout);
printf("%d\n",flux());
fclose(stdout);
return 0;
}