Pagini recente » Cod sursa (job #852071) | Cod sursa (job #2790460) | Cod sursa (job #889229) | Cod sursa (job #2040541) | Cod sursa (job #134985)
Cod sursa(job #134985)
#include <stdio.h>
#include <stdlib.h>
#include <bitset>
using namespace std;
long n,m,x,y,p,q,i,dim,ok,nod;
long l[30005],cl[30005];
int a[30005],b[30005],c[30005],n1,n2,n3;
int *v[30002],*point;
int g[30002];
bitset <30002>mark;
int main(){
freopen("sate.in","r",stdin);
freopen("sate.out","w",stdout);
scanf("%ld %ld %ld %ld",&n,&m,&x,&y);
for (i=1;i<=m;i++){
scanf("%ld %ld %ld",&n1,&n2,&n3);
g[n1]+=2;
g[n2]+=2;
a[i]=n1;b[i]=n2;c[i]=n3;
}
for (i=1;i<=n;i++){
v[i]=(int*)malloc((g[i]+2)*sizeof(int));
g[i]=0;
}
for (i=1;i<=m;i++){
//scanf("%ld %ld %ld",&a,&b,&c);
v[a[i]][++g[a[i]]]=b[i];
v[a[i]][++g[a[i]]]=c[i];
v[b[i]][++g[b[i]]]=a[i];
v[b[i]][++g[b[i]]]=c[i];
}
//for (i=1;i<=n;i++)
// v[i][++g[i]]=-1;
p=1;q=1;
l[1]=x;
mark[x]=1;
cl[1]=0;
/*
for (;p<=q;p++){
for (point=v[l[p]]+1;*point!=-1;point+=2)
if (!mark[*point]){
mark[*point]=1;
l[++q]=*point;
if (l[p]<l[q])
cl[q]=cl[p]+*(point+1);
else cl[q]=cl[p]-*(point+1);
if (l[q]==y){ok=1;break;}
}
if (ok){printf("%ld\n",cl[q]);return 0;}
}
*/
while (p<=q){
for (i=1;i<=g[l[p]];i+=2){
nod=v[l[p]][i];
if (!mark[nod]){
mark[nod]=1;
q++;
l[q]=nod;
if (l[p]<nod)
cl[q]=cl[p]+v[l[p]][i+1];
else
cl[q]=cl[p]-v[l[p]][i+1];
if (nod==y){ok=1;break;}
}
}
if (ok){printf("%ld\n",cl[q]);return 0;}
p++;
}
return 0;
}