Pagini recente » Cod sursa (job #2694025) | Cod sursa (job #2850843) | Cod sursa (job #153990) | Cod sursa (job #2914448) | Cod sursa (job #67895)
Cod sursa(job #67895)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define Nm 30001
#define Mm 100024
#define Unvizited 1000000000
#define abs(x) ((x)<0?-(x):(x))
int D[Nm],Dx[Nm],Dy[Nm],X[Mm],Y[Mm],C[Mm],n,m,x,y;
struct edge
{
int x,c;
} *G[Nm];
void read()
{
char S[18];
int i;
freopen("sate.in","r",stdin);
scanf("%d%d%d%d\n",&n,&m,&x,&y);
for(i=0;i<m;++i)
{
gets(S);
X[i]=atoi(strtok(S," "));
Y[i]=atoi(strtok(NULL," "));
C[i]=atoi(strtok(NULL," "));
}
}
void DFSx(int x)
{
int i,y;
for(i=0;i<D[x];++i)
{
y=G[x][i].x;
if(Dx[y]==Unvizited)
{
Dx[y]=Dx[x]+G[x][i].c;
DFSx(y);
}
}
}
void DFSy(int x)
{
int i,y;
for(i=0;i<D[x];++i)
{
y=G[x][i].x;
if(Dy[y]==Unvizited)
{
Dy[y]=Dy[x]+G[x][i].c;
DFSy(y);
}
}
}
int solve()
{
int i;
for(i=0;i<m;++i)
{
++D[X[i]];
++D[Y[i]];
}
for(i=1;i<=n;++i)
{
G[i]=(edge*)malloc(D[i]*sizeof(edge));
D[i]=0;
}
for(i=0;i<m;++i)
{
G[X[i]][D[X[i]]].x=Y[i];
G[X[i]][D[X[i]]++].c=C[i];
G[Y[i]][D[Y[i]]].x=X[i];
G[Y[i]][D[Y[i]]++].c=-C[i];
}
for(i=1;i<=n;++i)
Dx[i]=Dy[i]=Unvizited;
Dx[x]=0; DFSx(x);
Dy[y]=0; DFSy(y);
for(i=1;i<=n;++i)
if(Dx[i]!=Unvizited && Dy[i]!=Unvizited)
return abs(abs(Dx[i])-abs(Dy[i]));
}
void write(int s)
{
freopen("sate.out","w",stdout);
printf("%d\n",s);
}
int main()
{
read();
write(solve());
return 0;
}