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 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.
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.
If there are no solutions, output -1.
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
Case #1: 2
Case #2: 3
分析:
本题的坑点在于建图的时候边数太多,因为每x层与x+1层中的每一个点都相互连接,这样就有 Nx^N(x+1) 条边,sum(Ni)为10^5,暴力建图肯定会爆的
建图的时候,每一层增加一个“层点”作为中介,然后层点与层点建边,层点与在该层上的点建边(边长为0),点与相邻层点建边(边长为c)。
最后增加的边,点与点建边。
在赛场上怂了,看见10^5没敢多建边,只想着如何在层之间建边了。。。对时间复杂度与时间限制的把握还是不好,以后要记住常用算法的复杂度,还要学习如何准确分析时间复杂度
代码:

1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 #include <queue>
5 #include <vector>
6 #define maxn 200005
7 #define INF 0x3f3f3f3f
8 using namespace std;
9
10 int n,m,c,ans,cnt;
11 bool vis[maxn],vv[maxn];
12 int dist[maxn],pp[maxn],lay[maxn];
13 struct Node
14 {
15 int v,w;
16 int next;
17 } edge[20*maxn];
18 queue<int>q;
19
20 void init()
21 {
22 memset(pp,0,sizeof(pp));
23 memset(vv,0,sizeof(vv));
24 memset(dist,0x3f,sizeof(dist));
25 }
26 void addedge(int u,int v,int w)
27 {
28 cnt++;
29 edge[cnt].v=v;
30 edge[cnt].w=w;
31 edge[cnt].next=pp[u];
32 pp[u]=cnt;
33 }
34 void SPFA()
35 {
36 int i,j,u,v,w;
37 memset(vis,0,sizeof(vis));
38 while(!q.empty()) q.pop();
39 dist[1]=0;
40 vis[1]=1;
41 q.push(1);
42 while(!q.empty())
43 {
44 u=q.front();
45 q.pop();
46 vis[u]=0;
47 for(i=pp[u]; i; i=edge[i].next)
48 {
49 v=edge[i].v;
50 w=edge[i].w;
51 if(dist[v]>dist[u]+w)
52 {
53 dist[v]=dist[u]+w;
54 if(!vis[v])
55 {
56 vis[v]=1;
57 q.push(v);
58 }
59 }
60 }
61 }
62 }
63 int main()
64 {
65 int i,j,t,u,v,w,test=0;
66 scanf("%d",&t);
67 while(t--)
68 {
69 scanf("%d%d%d",&n,&m,&c);
70 init();
71 cnt=0;
72 for(i=1; i<=n; i++)
73 {
74 scanf("%d",&u);
75 lay[i]=u;
76 vv[u]=1;
77 }
78 for(i=1; i<n; i++)
79 {
80 if(vv[i]&&vv[i+1]) // 两层都出现过点相邻层才建边
81 {
82 addedge(n+i,n+i+1,c);
83 addedge(n+i+1,n+i,c);
84 }
85 }
86 for(i=1; i<=n; i++) // 层到点建边 点到相邻层建边
87 {
88 addedge(n+lay[i],i,0);
89 if(lay[i]>1) addedge(i,n+lay[i]-1,c);
90 if(lay[i]<n) addedge(i,n+lay[i]+1,c);
91 }
92 for(i=1; i<=m; i++) // 点到点建边
93 {
94 scanf("%d%d%d",&u,&v,&w);
95 addedge(u,v,w);
96 addedge(v,u,w);
97 }
98 SPFA();
99 printf("Case #%d: ",++test);
100 ans=dist[n];
101 if(ans<INF) printf("%d\n",ans);
102 else printf("-1\n");
103 }
104 return 0;
105 }
HDU 4725 The Shortest Path in Nya Graph (最短路 )的更多相关文章
- Hdu 4725 The Shortest Path in Nya Graph (spfa)
题目链接: Hdu 4725 The Shortest Path in Nya Graph 题目描述: 有n个点,m条边,每经过路i需要wi元.并且每一个点都有自己所在的层.一个点都乡里的层需要花费c ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- (中等) 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 ...
- 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 ...
- HDU - 4725 The Shortest Path in Nya Graph 【拆点 + dijkstra】
This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just ...
随机推荐
- JMX jconsole 的使用
JMX 1. JMX简单介绍 JMX的全称为Java Management Extensions. 顾名思义,是管理Java的一种扩展.这种机制可以方便的管理正在运行中的Java程序.常用于管理线程, ...
- css背景图自适应全屏显示
前几天我在写一个前端页面的时候,需要用到全屏背景图,但是怎么写都不行(要么不全屏,要么不兼容Bootstrap的响应式布局).对,是我腊鸡 后来我在网上找的时候找到一个大神写的笔记,参(照)考(抄)之 ...
- 无障碍开发(三)之ARIA aria-***属性值
aria-***属性值
- 记一些使用mpvue时遇到的问题
一.在mpvue中使用vuex(和在vue中使用不同) 1.vue中使用vuex,在main.js中: import store from './store' new Vue({ store }) ...
- chrome 浏览器安装 postman
chrome 浏览器安装 postman(插件下载见文章末尾) 1.安装方法 将下载的crx插件拖拽到chrome浏览器即可安装成功. 2.特殊情况 问题: chrome73版本后拖拽安装chrome ...
- html2canvas+Canvas2Image分享海报功能踩坑
首先需要 import html2canvas from 'html2canvas'; import {Canvas2Image} from '../../assets/js/plug/canvas2 ...
- 精通shell编程--最后的总结
不得不说shell语法是丑陋的,操作是简单高效的,最后一次学习总结shell shell总结 字符串删除与替换等常见操作 ## 字符串长度 a=1234 echo "${#a}" ...
- 转载:ubuntu 下添加简单的开机自启动脚本
转自:https://www.cnblogs.com/downey-blog/p/10473939.html linux下添加简单的开机自启动脚本 在linux的使用过程中,我们经常会碰到需要将某个自 ...
- appium基础之简单的小例子
appium环境搭建了,当然也要开始用起来了,记录一下学习的过程 遇到问题 1.The permission to start '.ui.home.view.HomeActivity' activit ...
- redis一键部署脚本
1.新建一个名为 auto_install_redis.sh的文件 2.将下面脚本拷贝到文件中,具体步骤在注释里面 #环境 linux #一键安装redis,在linux环境中使用脚本运行该文件(sh ...