Solución al problema número 495 de AceptaelReto - 495.

Cualquier duda no dudes en contactar.

#include <bits/stdc++.h>
#define INF 0x3F3F3F3F
using namespace std;
const int MAXN = 1500;
struct edge{
int from, to, weight; edge(){}
edge(int a, int b, int c){
from = a; to = b; weight = c; }};
struct state{
int node, dist; state(){}
state(int a, int b){node = a; dist = b; }
bool operator<(const state &other)const{
return other.dist < dist; } };
vector<edge> graph[MAXN];
int dist[MAXN];
int dijkstra(int start, int end){ dist[start] = 0;
priority_queue<state> pq;
pq.push(state(start, 0));
while(!pq.empty()){
state cur = pq.top(); pq.pop();
if(dist[cur.node] < cur.dist) continue;
if(cur.node == end) return cur.dist;
for(int i=0;i<graph[cur.node].size();i++){
int dest = graph[cur.node][i].to;
int wht = graph[cur.node][i].weight + cur.dist;
if(dist[dest] <= wht) continue;
dist[dest] = wht;
pq.push(state(dest, wht));
} } return -1; }

int main(){
	int cases;
	while(scanf("%d",&cases)==1 && cases!=0)
	{
	cases++;
	memset(dist,INF,sizeof(dist));
	int arr[cases];
	int arrw[cases];
	arr[0]=0; arrw[0]=0;
	for(int i=0;i<=cases;i++) graph[i].clear();
	for(int i=1;i<cases;i++) cin>>arr[i];
	for(int i=1;i<cases;i++) cin>>arrw[i];
	int m; cin>>m;
	for(int i=0;i<cases;i++){
	 for(int j=i+1; j<cases;j++)
		if(abs(arr[i]-arr[j])<=m)
		{
		graph[i].push_back(edge(i,j,arrw[j]));
		//cout<<arr[i]<<" "<<arr[j]<<" "<<arrw[j]<<endl;
		}
	}
	printf("%d\n",dijkstra(0,cases-1));
	for(int i=0;i<=cases;i++) graph[i].clear();
	}
return 0; 
}

No te pierdas nada.

Sigue en contacto con Isaac Lozano Osorio!