This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of this paragraph, just move on.
The Nya graph is an undirected graph with "layers". Each node in the graph belongs to a layer, there are N nodes in total.
You can move from any node in layer x to any node in layer x + 1, with cost C, since the roads are bi-directional, moving from layer x + 1 to layer x is also allowed with the same cost.
Besides, there are M extra edges, each connecting a pair of node u and v, with cost w.
Help us calculate the shortest path from node 1 to node N.
Input
The first line has a number T (T <= 20) , indicating the number of test cases.
For each test case, first line has three numbers N, M (0 <= N, M <= 10 5) and C(1 <= C <= 10 3), which is the number of nodes, the number of extra edges and cost of moving between adjacent layers.
The second line has N numbers l i (1 <= l i <= N), which is the layer of i th node belong to.
Then come N lines each with 3 numbers, u, v (1 <= u, v < =N, u <> v) and w (1 <= w <= 10 4), which means there is an extra edge, connecting a pair of node u and v, with cost w.
Output
For test case X, output "Case #X: " first, then output the minimum cost moving from node 1 to node N.
If there are no solutions, output -1.
Sample Input
2 3 3 3 1 3 2 1 2 1 2 3 1 1 3 3 3 3 3 1 3 2 1 2 2 2 3 2 1 3 4
Sample Output
Case #1: 2 Case #2: 3
题目 是 有n个点在不同的楼层里(一层可能有多个点) 层间距是 c 相邻层里的点连通 另外有m条边
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
#include<cstdio>
#define Maxn 202200
#define inf 0x3f3f3f3f
using namespace std;
int head[Maxn];
int dis[Maxn];
int have[Maxn];
int ly[Maxn];
int ans;
int n;
struct node{
int to, cost;
int next;
}edge[Maxn * 8];
int vis[Maxn];
void init(){
for(int i = 0; i <= n * 2; i++){
head[i] = -1;
have[i] = 0;
}
ans = 0;
}
void add(int from, int to, int cost){
edge[ans].to = to;
edge[ans].cost = cost;
edge[ans].next = head[from];
head[from] = ans++;
}
void spfa(){
for(int i = 0; i <= 2 * n; i++){
vis[i] = 0;
dis[i] = inf;
}
dis[1] = 0;
queue <int> que;
que.push(1);
vis[1] = 1;
while(!que.empty()){
int u = que.front();
que.pop();
vis[u] = 0;
for(int s = head[u]; s != -1; s = edge[s].next){
int v = edge[s].to;
int cost = edge[s].cost;
if(dis[v] > dis[u] + cost){
dis[v] = dis[u] + cost;
if(!vis[v]){
vis[v] = 1;
que.push(v);
}
}
}
}
}
int main(){
int t;
scanf("%d", &t);
int up = 1;
int m, c;
while(t--){
scanf("%d %d %d", &n, &m, &c);
init();
for(int i = 1; i <= n; i++){
scanf("%d", &ly[i]);
have[ly[i]] = 1;
}
for(int i = 1; i <= n - 1; i++){
if(have[i] && have[i + 1]){
add(n + i, n + i + 1, c);
add(n + i + 1, n + i, c);
}
}
for(int i = 1; i <= n; i++){
add(n + ly[i], i, 0);
if(ly[i] > 1)add(i, n + ly[i] - 1, c);
if(ly[i] < n)add(i, n + ly[i] + 1, c);
}
for(int i = 1; i <= m; i++){
int uu, vv, ww;
scanf("%d %d %d", &uu, &vv, &ww);
add(uu, vv, ww);
add(vv, uu, ww);
}
spfa();
printf("Case #%d: ", up++);
int h = dis[n];
if(h < inf)printf("%d\n", h);
else printf("-1\n");
}
return 0;
}