Cod sursa(job #1380319)

Utilizator CartofJohnsonFMI Tanasescu Andrei CartofJohnson Data 7 martie 2015 14:25:01
Problema Sate Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <cstdio>
#include <cstdlib>
//http://pastebin.com/FqzE82NA
using namespace std;
int main(){
	freopen("sate.in","r",stdin);
	freopen("sate.out","w",stdout);
	int n,m,x,y,z,n1,n2;
	cin>>n>>m>>n1>>n2;
	int*** v=new int**[n+1];
	for(int i=0;i<=n;i++){
		v[i]=new int*[n+1];
		for(int j=0;j<=n;j++){
			v[i][j]=new int[2];
			v[i][j][0]=v[i][j][1]=0;
		}
	}//initializam tot.
	for(int i=0;i<m;i++){
		scanf("%d %d %d",&x,&y,&z);
		v[x][0][0]++;v[y][0][0]++;
		v[x][v[x][0][0]][0]=y;
		v[x][v[x][0][0]][1]=z;
		v[y][v[y][0][0]][0]=x;
		v[y][v[y][0][0]][1]=z;
	}//marcam existenta muchiilor (x,y) de cost z, gradele fiind stocate pe prima coloana
	for(int i=1;i<=n;i++)v[0][i][0]=v[i][0][0];//punem gradele pe prima linie
	//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
		for(int j=1;j<=v[c][0][0];j++)//daca nu, pentru fiecare vecin al lui
			if(!vizitat[v[c][j][0]]){//nevizitat deja
				queue[len++]=v[c][j][0];//il bagam in coada
				vizitat[v[c][j][0]]=1;//il marcam ca vizitat
				if(v[c][j][0]>c)//daca e la dreapta
					distante[v[c][j][0]]=v[c][j][1]+distante[c];//offset-ul rceste
				else //altfel e la stanga
					distante[v[c][j][0]]=-v[c][j][1]+distante[c];//si offset-ul scade
			}
	}
	cout<<distante[n2];//scriem offset-ul lui n2
	skip:
	return 0;
}