2013成都邀请赛J题||HDU4725 The Shortest Path in Nya Graph(spfa+slf优化最短路)

本文主要是介绍2013成都邀请赛J题||HDU4725 The Shortest Path in Nya Graph(spfa+slf优化最短路),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目地址:HDU 4725

这题卡了好长时间了,建图倒是会建,但是不会最短路的算法优化,本以为都需要堆去优化的,打算学了堆之后再来优化,但是昨晚CF的一道题。。(那题也是不优化过不了。。)然后我就知道了还有不需要堆也可以的优化,而且优化的操作很简单,把单向队列变成双端队列就行了。具体优化思路是若d[v]比队列前端的元素的距离小,就加入队列前端,否则加入队列尾端。很简单吧。。。会了后,把这题一加上slf优化就过了。。。

其实这题的重点在于建图。。不在于优化。。。。sad。。

这题的建图就是把层次也都抽象成两个点,一个用来出,一个用来进。我是看的kuangbin大神的博客才知道的。

详情见kuangbin大神博客。。kuangbin大神博客

懒得去的可以看下面博文文字的复制。。

N个点,然后有N层,要假如2*N个点。

总共是3*N个点。

点1~N就是对应的实际的点1~N. 要求的就是1到N的最短路。

然后点N+1 ~ 3*N 是N层拆出出来的点。

第i层,入边到N+2*i-1, 出边从N+2*i 出来。(1<= i <= N)

N + 2*i 到 N + 2*(i+1)-1 加边长度为C. 表示从第i层到第j层。

N + 2*(i+1) 到 N + 2*i - 1 加边长度为C,表示第i+1层到第j层。

如果点i属于第u层,那么加边 i -> N + 2*u -1 N + 2*u ->i 长度都为0

然后我的代码如下:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <algorithm>using namespace std;
const int INF=0x3f3f3f3f;
int vis[310000], d[310000], cnt, head[310000], n, num;
struct node
{int u, v, w, next;
} edge[700000];
void add(int u, int v, int w)
{edge[cnt].v=v;edge[cnt].w=w;edge[cnt].next=head[u];head[u]=cnt++;
}
void spfa()
{int f1=0, f2=0, i;deque<int>q;q.push_back(1);memset(d,INF,sizeof(d));memset(vis,0,sizeof(vis));d[1]=0;vis[1]=1;while(!q.empty()){int u=q.front();q.pop_front();vis[u]=0;for(i=head[u]; i!=-1; i=edge[i].next){int v=edge[i].v;if(d[v]>d[u]+edge[i].w){d[v]=d[u]+edge[i].w;if(!vis[v]){vis[v]=1;if(!q.empty()&&d[v]<d[q.front()]){q.push_front(v);}elseq.push_back(v);}}}}if(d[n]==INF)d[n]=-1;printf("Case #%d: %d\n",num,d[n]);
}
int main()
{int t, u, v, w, m, c, i;num=0;scanf("%d",&t);while(t--){num++;memset(head,-1,sizeof(head));memset(vis,0,sizeof(vis));cnt=0;scanf("%d%d%d",&n,&m,&c);for(i=1; i<=n; i++) //将第i个边与该边所属的层次u相连。{scanf("%d",&u);add(i,n+2*u-1,0);add(n+2*u,i,0);}for(i=1; i<n; i++) //将每两个相邻的层次互连{add(n+2*i+1,n+2*i,c);add(n+2*i-1,n+2*i+2,c);}while(m--){scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}spfa();}return 0;
}


这篇关于2013成都邀请赛J题||HDU4725 The Shortest Path in Nya Graph(spfa+slf优化最短路)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103740

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

poj 1511 Invitation Cards(spfa最短路)

题意是给你点与点之间的距离,求来回到点1的最短路中的边权和。 因为边很大,不能用原来的dijkstra什么的,所以用spfa来做。并且注意要用long long int 来存储。 稍微改了一下学长的模板。 stack stl 实现代码: #include<stdio.h>#include<stack>using namespace std;const int M

poj 3259 uva 558 Wormholes(bellman最短路负权回路判断)

poj 3259: 题意:John的农场里n块地,m条路连接两块地,w个虫洞,虫洞是一条单向路,不但会把你传送到目的地,而且时间会倒退Ts。 任务是求你会不会在从某块地出发后又回来,看到了离开之前的自己。 判断树中是否存在负权回路就ok了。 bellman代码: #include<stdio.h>const int MaxN = 501;//农场数const int

poj 1502 MPI Maelstrom(单源最短路dijkstra)

题目真是长得头疼,好多生词,给跪。 没啥好说的,英语大水逼。 借助字典尝试翻译了一下,水逼直译求不喷 Description: BIT他们的超级计算机最近交货了。(定语秀了一堆词汇那就省略吧再见) Valentine McKee的研究顾问Jack Swigert,要她来测试一下这个系统。 Valentine告诉Swigert:“因为阿波罗是一个分布式共享内存的机器,所以它的内存访问

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

poj 3159 (spfa差分约束最短路) poj 1201

poj 3159: 题意: 每次给出b比a多不多于c个糖果,求n最多比1多多少个糖果。 解析: 差分约束。 这个博客讲差分约束讲的比较好: http://www.cnblogs.com/void/archive/2011/08/26/2153928.html 套个spfa。 代码: #include <iostream>#include <cstdio>#i

hdu 3790 (单源最短路dijkstra)

题意: 每条边都有长度d 和花费p,给你起点s 终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的。 解析: 考察对dijkstra的理解。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstrin

poj 3169 spfa 差分约束

题意: 给n只牛,这些牛有些关系。 ml个关系:fr 与 to 牛间的距离要小于等于 cost。 md个关系:fr 与 to 牛间的距离要大于等于 cost。 隐含关系: d[ i ] <= d[ i + 1 ] 解析: 用以上关系建图,求1-n间最短路即可。 新学了一种建图的方法。。。。。。 代码: #include <iostream>#include