Pagini recente » Cod sursa (job #3199653) | Cod sursa (job #59727) | Cod sursa (job #3266079) | Cod sursa (job #3240513) | Cod sursa (job #1380548)
#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;
}
inline void print(void){
int i=1;
for(;i<=n;i++){
for(nod*q=g[i]->n;q;q=q->n)cout<<i<<"-"<<q->x<<"-"<<q->d<<" ";
cout<<"\n";
}
}
int main(){
cin>>n>>m>>n1>>n2;
init();
for(int i=0;i<m;i++){
int x,y,z; cin>>x>>y>>z;
push(x,y,z);
push(y,x,z);
}//LAdj
int *queue=new int[n],*vizitat=new int[n],len=1,sol=0,i;
int *distante=new int[n];
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){sol=1;break;}//daca e bun ne oprim
nod *q=g[c]->n;
for(int j=1;j<=g[c]->x;j++,q=q->n){//daca nu, pentru fiecare vecin al lui
if(!vizitat[q->x]){//nevizitat deja
queue[len++]=q->x;//il bagam in coada
vizitat[q->x]=1;//il marcam ca vizitat
if(q->x>c)//daca e la dreapta
distante[q->x]=q->d+distante[c];//offset-ul rceste
else //altfel e la stanga
distante[q->x]=-q->d+distante[c];//si offset-ul scade
}
}
}
cout<<distante[n2];//scriem offset-ul lui n2
skip:
return 0;
}