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.

InputThe 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.OutputFor 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

这题的难点是层数的处理,有两种处理方法。
一种是仔细想可以想到的,用vector把每层的点存下来,在djkstra松弛操作的同时,对当前点的相邻两层点全部松弛一遍(具体看代码)。
第二种应该是正解,就是拆点。其实上一种也相当于拆点,只不过拆很暴力,不够彻底。
我们可以把层当做一个新的点,在该层的点到该层的距离为0,该层到相邻层的距离为c。但因为同层的点不一定相互联通,所以要把一个层分为两个点,一个入口点,一个出口点,入口点和出口点之间不联通。
法一ac代码:
  1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 #include <cmath>
6 #include <queue>
7 using namespace std;
8 typedef long long ll;
9 const int inf = 0x3f3f3f3f;
10 const int maxn = 1e5 + 10;
11 int n, m, c;
12 int pos[maxn];
13 vector<int> laye[maxn];
14 int head[maxn];
15 int d[maxn];
16 bool vis[maxn];
17 bool visi[maxn];
18 struct edge{
19 int to, nex, cost;
20 }eg[2 * maxn];
21 int cnt = 0;
22 inline void add(int u,int v,int cost) {
23 eg[cnt].to = v;
24 eg[cnt].nex = head[u];
25 eg[cnt].cost = cost;
26 head[u] = cnt++;
27 }
28 struct Rule {
29 bool operator () (int &a,int &b) const {
30 return d[a] > d[b];
31 }
32 };
33 inline void dijkstra(int s) {
34 memset(vis, 0, sizeof(vis));
35 memset(d, inf, sizeof(d));
36 priority_queue<int, vector<int>, Rule> q;
37 d[s] = 0;
38 q.push(s);
39 while(!q.empty()) {
40 int u = q.top(); q.pop();
41 for(int k = head[u]; ~k; k = eg[k].nex) {
42 int v = eg[k].to;
43 if(d[v] > d[u] + eg[k].cost) {
44 // printf("%d %d %d\n", u, v,eg[k].cost);
45 d[v] = d[u] + eg[k].cost;
46 q.push(v);
47 }
48 }
49 if(pos[u] < n && !vis[pos[u]+ 1]) {
50 vis[pos[u] + 1] = true; //注意标记层数,不然会超时
51 for(int i = 0; i < laye[pos[u] + 1].size(); ++i) {
52 int v = laye[pos[u] + 1][i];
53 if(d[v] > d[u] + c) {
54 // printf("%d %d %d\n", u, v,c);
55 d[v] = d[u] + c;
56 q.push(v);
57
58 }
59 }
60 }
61 if(pos[u] > 1 && !vis[pos[u] - 1]) {
62 vis[pos[u] - 1] = true;
63 for(int i = 0; i < laye[pos[u] - 1].size(); ++i) {
64 int v = laye[pos[u] - 1][i];
65 if(d[v] > d[u] + c) {
66 // printf("%d %d %d\n", u, v,c);
67 d[v] = d[u] + c;
68 q.push(v);
69
70 }
71 }
72 }
73 }
74 }
75 int main()
76 {
77 int t;
78 scanf("%d", &t);
79 for(int cas = 1; cas <= t; ++cas) {
80 cnt = 0;
81 memset(head, -1, sizeof(head));
82 memset(pos, 0, sizeof(pos));
83
84 scanf("%d %d %d", &n, &m, &c);
85 int u, v, cost;
86 for(int i = 1; i <= n; ++i) {
87 scanf("%d", &u);
88 pos[i] = u;
89 laye[u].push_back(i);
90 }
91 for(int i =0; i < m; ++i) {
92 scanf("%d %d %d", &u, &v, &cost);
93 add(u, v, cost);
94 add(v, u, cost);
95 }
96
97 dijkstra(1);
98 if(d[n] == inf || n == 0)
99 printf("Case #%d: -1\n", cas);
100 else
101 printf("Case #%d: %d\n", cas, d[n]);
102 for(int i = 1; i <= n; ++i) laye[i].clear();
103 }
104 return 0;
105 }

法二代码:

 1 #include <cstdio>
2 #include <cstring>
3 #include <iostream>
4 #include <algorithm>
5 #include <cmath>
6 #include <queue>
7 using namespace std;
8 typedef long long ll;
9 const int inf = 0x3f3f3f3f;
10 const int maxn = 5 * 1e5;
11 int n, m, c;
12 int pos[maxn];
13 vector<int> laye[maxn];
14 int head[maxn];
15 int d[maxn];
16 bool vis[maxn];
17 struct edge{
18 int to, nex, cost;
19 }eg[maxn];
20 int cnt = 0;
21 void add(int u,int v,int cost) {
22 eg[cnt].to = v;
23 eg[cnt].nex = head[u];
24 eg[cnt].cost = cost;
25 head[u] = cnt++;
26 }
27 struct Rule {
28 bool operator () (int a,int b) const {
29 return d[a] > d[b];
30 }
31 };
32 void dijkstra(int s) {
33 memset(d, inf, sizeof(d));
34 priority_queue<int, vector<int>, Rule> q;
35 d[s] = 0;
36 q.push(s);
37 while(!q.empty()) {
38 int u = q.top(); q.pop();
39 for(int k = head[u]; k != -1; k = eg[k].nex) {
40 int v = eg[k].to;
41 if(d[v] > d[u] + eg[k].cost) {
42 // printf("%d %d %d\n", u, v,eg[k].cost);
43 d[v] = d[u] + eg[k].cost;
44 q.push(v);
45 }
46
47 }
48 }
49 }
50 int main()
51 {
52 int t;
53 scanf("%d", &t);
54 for(int cas = 1; cas <= t; ++cas) {
55
56 cnt = 0;
57 memset(d, inf, sizeof(d));
58 memset(head, -1, sizeof(head));
59 memset(pos, 0, sizeof(pos));
60 scanf("%d %d %d", &n, &m, &c);
61 int u, v, cost;
62 for(int i = 1; i <= n; ++i) {
63 scanf("%d", &u);
64 pos[i] = u;
65 add(i, n + 2 * u - 1, 0);//层内的点到该层距离为0
66 add(n + 2 * u, i, 0);
67 vis[u] = true;
68 }
69 for(int i = 1; i < n; ++i) {
70 if(vis[i] && vis[i + 1]) {//这个似乎不加也行
71 add(n + 2 * i - 1, n + 2 * (i + 1), c);//相邻层之间的距离为c
72 add(n + 2 * (i + 1) - 1, n + 2 * i, c);
73 }
74 }
75 for(int i =0; i < m; ++i) {
76 scanf("%d %d %d", &u, &v, &cost);
77 add(u, v, cost);
78 add(v, u, cost);
79 }
80
81 dijkstra(1);
82 if(d[n] == inf || n == 0)
83 printf("Case #%d: -1\n", cas);
84 else
85 printf("Case #%d: %d\n", cas, d[n]);
86 }
87 return 0;
88 }

HDU - 4725 The Shortest Path in Nya Graph 【拆点 + dijkstra】的更多相关文章

  1. HDU - 4725 The Shortest Path in Nya Graph(拆点+Dijkstra)

    题意:N个点,每个点有一个层号L,相邻的两层 Li 与 Li+1 之间的距离为C.另外给出M条无向边,求从点1到点N的最短路. 分析:同一层之间的两点距离并不是0,这是一个小坑.依次把相邻两层的所有点 ...

  2. Hdu 4725 The Shortest Path in Nya Graph (spfa)

    题目链接: Hdu 4725 The Shortest Path in Nya Graph 题目描述: 有n个点,m条边,每经过路i需要wi元.并且每一个点都有自己所在的层.一个点都乡里的层需要花费c ...

  3. HDU 4725 The Shortest Path in Nya Graph [构造 + 最短路]

    HDU - 4725 The Shortest Path in Nya Graph http://acm.hdu.edu.cn/showproblem.php?pid=4725 This is a v ...

  4. HDU 4725 The Shortest Path in Nya Graph

    he Shortest Path in Nya Graph Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged o ...

  5. HDU 4725 The Shortest Path in Nya Graph(构图)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  6. HDU 4725 The Shortest Path in Nya Graph (最短路)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  7. hdu 4725 The Shortest Path in Nya Graph (最短路+建图)

    The Shortest Path in Nya Graph Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K ...

  8. (中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。

    Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...

  9. HDU 4725 The Shortest Path in Nya Graph(最短路径)(2013 ACM/ICPC Asia Regional Online ―― Warmup2)

    Description This is a very easy problem, your task is just calculate el camino mas corto en un grafi ...

  10. HDU 4725 The Shortest Path in Nya Graph (最短路 )

    This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just ...

随机推荐

  1. HTML&CSS:构建网站不能不说的那些事儿

    很高兴你能看到这个专栏!俗话说得好,相逢即是缘分,没准你和我在上一世也曾有过五百次的回眸,才得此一面.说的有点恶心了,咱还是书归正传,说说这个专栏吧. 这个专栏主要讲的是 HTML 和 CSS 的页面 ...

  2. Android 中使用 config.gradle

    各位同学大家好,当然了如果不是同学,那么大家也同好.哈哈. 大家知道config.gradle 是什么吗?我也不知道.开个完笑,其实config.gradle 就是我们为了统一gradle 中的各种配 ...

  3. 04--Docker数据卷和数据卷容器

    .为什么要使用数据卷: Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了.为了能保存数据在docke ...

  4. [Usaco2008 Nov]Buying Hay 购买干草

    题目描述 约翰的干草库存已经告罄,他打算为奶牛们采购H(1≤H≤50000)磅干草,他知道N(1≤N≤100)个干草公司,现在用1到N给它们编号.第i个公司卖的干草包重量为Pi(1≤Pi≤5000)磅 ...

  5. .NET Core 问题记录

    前言: 最近在项目中遇到了遇到了写部署步骤过多的问题,为了减少.net core项目部署步骤:需要对一些基础问题进行验证: 如端口设置.单页应用程序(angluar)合并部署方式等相关问题,特将解决过 ...

  6. Java并发包源码学习系列:阻塞队列实现之ArrayBlockingQueue源码解析

    目录 ArrayBlockingQueue概述 类图结构及重要字段 构造器 出队和入队操作 入队enqueue 出队dequeue 阻塞式操作 E take() 阻塞式获取 void put(E e) ...

  7. (05)-Python3之--运算符操作

    1.算数运算 num_a = 100 num_b = 5000 # 加法 + print(num_a + num_b) # 减法 - print(num_a - num_b) # 乘法 * print ...

  8. Spark SQL如何选择join策略

    前言 众所周知,Catalyst Optimizer是Spark SQL的核心,它主要负责将SQL语句转换成最终的物理执行计划,在一定程度上决定了SQL执行的性能. Catalyst在由Optimiz ...

  9.  Go is more about software engineering than programming language research.

    https://talks.golang.org/2012/splash.article Go at Google: Language Design in the Service of Softwar ...

  10. vscode远程开发安装

    https://www.cnblogs.com/xiaoqi/p/vs-code-remote.html ============================= https://blog.csdn ...