Pagini recente » Cod sursa (job #1040629) | Cod sursa (job #2008553) | Cod sursa (job #1896614) | Cod sursa (job #2797056) | Cod sursa (job #2247338)
#include <cstdio>
#include <vector>
#include <deque>
#include <bitset>
#include <algorithm>
#define DIMN 351
#define DIMM 12501
#define INF 2000000000
using namespace std;
int n,m,s,d;
int dist[DIMN],cst[DIMN][DIMN],c[DIMN][DIMN];
pair <int,int> nr[DIMM];
vector <int> v[DIMN];
deque <int> dq;
bitset <DIMN> f;
inline void bellmanford(){
int i,nod,vecin;
f.reset();
for (i=1;i<=n;i++)
if (i!=s)
dist[i]=INF;
dq.push_back(s);
f[s]=1;
while (dq.size()){
nod=dq.front();
for (i=0;i<v[nod].size();i++){
vecin=v[nod][i];
if (dist[nod]+cst[nod][vecin]<dist[vecin]){
dist[vecin]=dist[nod]+cst[nod][vecin];
if (!f[vecin]) {// nu e in deque
f[vecin]=1;
dq.push_back(vecin);
}
}
}
dq.pop_front();
f[nod]=0;
}
/// C[i] = distanta minima de la sursa la i
}
int main()
{
FILE *fin=fopen ("fmcm.in","r");
FILE *fout=fopen ("fmcm.out","w");
int i,x,y,cap,cost;
fscanf (fin,"%d%d%d%d",&n,&m,&s,&d);
for (i=1;i<=m;i++){
fscanf (fin,"%d%d%d%d",&x,&y,&cap,&cost);
c[x][y]=cap;
cst[x][y]=cost;
nr[i]=make_pair(x,y);
//cst[y][x]=-cost;
v[x].push_back(y);
//v[y].push_back(x);
}
bellmanford();
for (i=1;i<=m;i++){
x=nr[i].first;
y=nr[i].second;
cst[x][y]+=dist[x]-dist[y]; /// costul bun sa fie >= 0
cst[y][x]=-cst[x][y];
}
return 0;
}