Pagini recente » Cod sursa (job #57303) | Cod sursa (job #2770101) | Cod sursa (job #396607) | Cod sursa (job #2042715) | Cod sursa (job #1380553)
#include <iostream>
using namespace std;
typedef struct nod{int x,d; nod* n;};//Fiecare link da un vecin si distanta pana la el
nod* g[30001]; int n,m,n1,n2;
inline void init(void){
register int i=1;
for(;i<=n+1;i++){
g[i]=new nod();
g[i]->x=g[i]->d=0;
g[i]->n=NULL;
}
return;
}
inline void push(int param, int x, int d){
g[param]->x++;
nod *q=g[param],*p=q->n;
q->n=new nod();q=q->n;
q->n=p; q->x=x;q->d=d;
}
int main(){
freopen("sate.in","r",stdin);
freopen("sate.out","w",stdout);
cin>>n>>m>>n1>>n2;
init();
for(register int i=0;i<m;i++){
int x,y,z; scanf("%d %d %d",&x,&y,&z);
push(x,y,z);
push(y,x,z);
}//LAdj
int *queue=(int*)malloc(n*sizeof(int)),*vizitat=(int*)malloc(n*sizeof(int)),len=1,sol=0,i;
int *distante=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++){vizitat[i+1]=0;distante[i+1]=0;};
//Fie o coada in care tinem minte unde avem de mers
//Fie un vector vizitat in care tinem minte ce am bagat deja in coada
//Fie un vectore distante in care tinem minte offset-ul fiecarui nod fata de nodul cu care am inceput - n1
queue[0]=n1;vizitat[n1]=1;
for(i=0;i<len;i++){
//Pentru fiecare nod din coada
int c=queue[i];//notat cu c pentru usurinta
if(c==n2){break;}//daca e bun ne oprim
nod *q=g[c]->n;
int br=g[c]->x;
for(int j=1;j<=br;j++,q=q->n){//daca nu, pentru fiecare vecin al lui
int t=q->x;
if(!vizitat[t]){//nevizitat deja
queue[len++]=t;//il bagam in coada
vizitat[t]=1;//il marcam ca vizitat
if(t>c)//daca e la dreapta
distante[t]=q->d+distante[c];//offset-ul rceste
else //altfel e la stanga
distante[t]=-q->d+distante[c];//si offset-ul scade
}
}
}
cout<<distante[n2];//scriem offset-ul lui n2
skip:
return 0;
}