Pagini recente » Borderou de evaluare (job #779968) | Cod sursa (job #603700) | Cod sursa (job #2818295) | Cod sursa (job #1876849) | Cod sursa (job #68669)
Cod sursa(job #68669)
#include <stdio.h>
#include <vector>
#define Nmax 30001
#define Mmax 100025
using namespace std;
vector<int> g[Nmax];
int N,M,X,Y,a[Mmax],b[Mmax],d[Mmax],nr[Nmax],c[Nmax],D[Nmax],i;
void bfs()
{
int st=1,dr,p;
D[c[dr=st]=X]=1;
while (st<=dr)
{
p=c[st];
for (i=0;i<nr[p];++i)
if (a[g[p][i]]==p)
{
if (D[ b[ g[p][i] ] ]==0)
{
c[++dr] = b[ g[p][i] ];
D[ c[dr] ] = D[ p ] + d[ g[p][i] ];
}
}
else if (D[ a[ g[p][i] ] ]==0)
{
c[++dr] = a[ g[p][i] ];
D[ c[dr] ] = D[ p ] - d[ g[p][i] ];
}
++st;
if (D[Y]!=0) return;
}
}
int main()
{
freopen("sate.in","r",stdin);
scanf("%d %d %d %d",&N,&M,&X,&Y);
for (i=1;i<=M;++i)
{
scanf("%d %d %d",&a[i],&b[i],&d[i]);
g[a[i]].push_back(i);
g[b[i]].push_back(i);
++nr[a[i]];
++nr[b[i]];
}
fclose(stdin);
bfs();
freopen("sate.out","w",stdout);
printf("%d",D[Y]-1);
fclose(stdout);
return 0;
}