Cod sursa(job #1380549)

Utilizator CartofJohnsonFMI Tanasescu Andrei CartofJohnson Data 8 martie 2015 01:26:13
Problema Sate Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.88 kb
#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(){
	freopen("sate.in","r",stdin);
    freopen("sate.out","w",stdout);
	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;
}