Pagini recente » Cod sursa (job #857807) | Cod sursa (job #1949334) | Cod sursa (job #516508) | Cod sursa (job #2717406) | Cod sursa (job #1701148)
#include <fstream>
using namespace std;
ifstream fin("sate.in");
ofstream fout("sate.out");
int N,M,X,Y,D[30001],S[30001],R[30001];
struct celula{
int info,c;
celula *next;} *V[30001];
void ADD(celula *& K,int info,int c){
celula *p;
p=new celula;
p->info=info;
p->c=c;
p->next=K;
K=p;
}
void citire(){
int a,b,c;
fin>>N>>M>>X>>Y;
while(fin>>a>>b>>c){
ADD(V[a],b,c);
ADD(V[b],a,c);}
}
int abs(int x){
if(x<0) return -x;
return x;
}
void parcurge(int x){
celula*p;
int prim,ultim;
prim=ultim=1;
R[prim] = X;
S[X] = 1;
while(prim <= ultim && !D[Y]){
for(p = V[R[prim]]; p!=NULL;p=p->next)
if(!S[p->info]){
S[p->info] = 1;
R[++ultim] = p->info;
if(R[prim] > p->info && R[1] < p->info)
D[p->info] = abs(D[R[prim]]-p->c);
if(R[prim] < p->info && R[1]<p->info){
if(R[1] < R[prim]) D[p->info] = D[R[prim]]+p->c;
if(R[1] > R[prim]) D[p->info] = abs(p->c - D[R[prim]]);
}
if(R[prim] > p->info && R[1] > p->info){
if(R[prim] > R[1]) D[p->info] = abs(p->c - D[R[prim]]);
if(R[prim] < R[1]) D[p->info] = D[R[prim]]+p->c;
}
if(R[prim]<p->info && R[1] > p->info)
D[p->info] = abs(D[R[prim]]-p->c);
}
prim++;
}
}
void init(){
for(celula*p=V[X];p!=NULL;p=p->next)
D[p->info] = p->c;
}
int main(){
citire();
init();
parcurge(X);
fout<<D[X];
return 0;
}