My Flag:通过题目类型 最短路提交该题讨论该问题有关讨论相关题解最优解题目难度得分:2分题目质量得分:3分目前共有:7人进行评分题目评分
查看题目 Show Problem[Donate]您的捐助,让RQNOJ明天更美好!题目:星门跳跃问题编号:341
题目描述在EVE游戏中,宇宙被划分成为许多区域,每个区域中都有数目不定的星门,可以通过星门来跳跃到特定的区域(星门是双向的)。
现在你正参与BBE联军与MLGBD联盟的会战,但由于飞船受损,需要尽快回到后方的友军空间站进行维护。
试编写程序,计算出所须的最短的返回空间站时间。
为了简化问题,我们约定飞船所在的位置为区域1,空间站所在的位置为区域N。问题规模:
对于80%的数据,1<N<=10000,1<M<50000;
对于100%的数据,1<N<=30000,1<M<150000,1<=X[],Y[]<=N,1<=Z[]<=4096;
输入格式第1行,两个整数N,M,分别为区域的总数和星门的总数;
第2..M+1行,每行三个整数X[i],Y[i],Z[i],分别为星门连接的两个区域,以及跳跃所需时间;
输出格式一个整数,返回空间站所需的最短时间。

星门跳跃,简单题。见注释

/*                                            *\提交了n次,对拍了几分钟第一次 裸spfa wa80第二次 尝试使用SLF优化,仍然不过第三次 尝试使用前向星,wa80第N次 wa80最后发现题目范围看错了,因此边表开小了看到了80%的数据m<=50000,所以开的100000但是其实100%的数据m<=150000最后测试的时候发现SLF优化也可以只是因为用的cin、cout所以超时。scanf和printf就好了SLF优化(341.cpp)要点:1、比较新节点和队首节点时队首为que[l+1]2、插入队首时要后递减que[l--] = ths->index;3、SLF的原理见http://tieba.baidu.com/f?kz=1192850879(貌似网上都说用SLF再加LLL,反而会更慢)前向星是个好东西啊,以后存储都常用前向星了前向星要点:1、读入边表2、根据起始点排序3、计算以每个点为起始点的数组中一段的边for (long i=1;i<m+1;i++)if (f[bian[i].f]==0)f[bian[i].f]=i;(优化:链式前向星http://www.cnblogs.com/ACoder/archive/2011/04/06/2006323.html)空间优化 循环队列要点:1、判断队列为空:只能用if (f!=r)if (f<r)是错误的2、取余操作:只要加到f、r操作的所有地方就行了另外 Heap+dijkstra也很高效,代码实现复杂一些\*                                            */#include <cstdio>
#include <cstdlib>
long n;long m;struct ftv
{long f;long t;long v;
};
ftv bian[300004];long top = 0;
long que[10000000];
bool used[30002];
long dist[30002];
long f[30002];void insert(long a,long b,long c)
{top ++;bian[top].f = a;bian[top].t = b;bian[top].v = c;
}void input()
{scanf("%ld %ld",&n,&m);for (long i=1;i<m+1;i++){long a;long b;long c;scanf("%ld %ld %ld",&a,&b,&c);insert(a,b,c);insert(b,a,c);}
}void spfa()
{for (long i=1;i<n+1;i++){dist[i] = 19940701;}dist[1] = 0;long l=0;long r=0;r++;que[r] = 1;while (l<r){l++;long now = que[l];used[now] = false;long i = f[now];if (i!=0){while (bian[i].f==now){if (dist[bian[i].t]>dist[now]+bian[i].v){dist[bian[i].t]=dist[now]+bian[i].v;if(!used[bian[i].t]){used[bian[i].t] = true;r++;que[r] = bian[i].t;}}i++;}}}
}int bigger(const void* a,const void* b)
{ftv* aa = (ftv*)a;ftv* bb = (ftv*)b;long aaa = aa->f;long bbb = bb->f;if (aaa>bbb){return 1;}else if (aaa==bbb){return 0;}else return -1;
}int main()
{
//    freopen("door.in","r",stdin);
//    freopen("door.out","w",stdout);input();m<<=1;qsort(bian+1,m,sizeof(ftv),&bigger);for (long i=1;i<m+1;i++)if (f[bian[i].f]==0)f[bian[i].f]=i;spfa();printf("%ld",dist[n]);
}

SLF优化版本AC

#include <cstdio>
//using std::cout;
//using std::cin;long n;long m;struct tnode
{long index;tnode* next;long pow;
};tnode* door[30002];
long que[3000000];
bool used[30002];
long dist[30002];void insert(long a,long b,long c)
{tnode* nnode = new tnode;nnode->index = b;nnode->next = door[a];nnode->pow = c;door[a] = nnode;
}void input()
{scanf("%ld %ld",&n,&m);for (long i=1;i<m+1;i++){long a;long b;long c;scanf("%ld %ld %ld",&a,&b,&c);insert(a,b,c);insert(b,a,c);}
}void spfa()
{for (long i=1;i<n+1;i++){dist[i] = 0x7fff0000;}dist[n] = 0;long l=0;long r=0;r++;que[r] = n;while (l<r){l++;long now = que[l];tnode* ths = door[now];used[now] = false;while (ths){if (dist[ths->index]>dist[now]+ths->pow){dist[ths->index] = dist[now]+ths->pow;if (!used[ths->index]){/*                             *\分两种情况如果队列为空或者队首较小都插到队首队列为空时虽然队首队尾含义相同但是采取++r防止下标越界 \*                               */ if (dist[ths->index]>=dist[que[l+1]]||l==0){used[ths->index] = true;que[++r] = ths->index;}else{used[ths->index] = true;que[l--] = ths->index;}}}ths = ths->next;}}
}int main()
{input();spfa();printf("%ld",dist[1]);
}

【星门跳跃】解题报告相关推荐

  1. 一月17日新生冬季练习赛解题报告B.函数问题

    B题的解题报告非常值得写,其解题思路让人叹为观止,比赛的时候没有一个人ac,其实我想用纯暴力劫一下试试呢,幸好没试,不然会挂的很惨 题目是这样的: B.函数问题 Time Limit: 1000 MS ...

  2. 百度之星初赛(1)解题报告

    超级赛亚ACMer Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  3. 快手2020校园招聘秋招笔试--算法C试卷 练习 解题报告 Apare_xzc

    快手2020校园招聘秋招笔试–算法C试卷 解题报告 Apare_xzc 2020/4/10 网页链接:牛客链接 题型分布: 选择题(2分/道*20道)         编程题(15分/道*4道) 选择 ...

  4. 第十届“图灵杯”NEUQ-ACM程序设计竞赛个人赛解题报告

    第十届"图灵杯"NEUQ-ACM 题目链接 解题报告 D 文稿修订 思路 代码 F 吃包子 思路 代码 G 数字鉴定 思路 代码 H 线性变换 思路 代码 I 试题排版 思路 代码 ...

  5. 解题报告 之 SGU438 The Glorious Karlutka River 时间流(动态流)

    解题报告 之 SGU438 The Glorious Karlutka River Description A group of  Mtourists are walking along the Ka ...

  6. uscao 线段树成段更新操作及Lazy思想(POJ3468解题报告)

    线段树成段更新操作及Lazy思想(POJ3468解题报告) 标签: treequerybuildn2cstruct 2011-11-03 20:37 5756人阅读 评论(0) 收藏 举报  分类: ...

  7. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  8. 【解题报告系列】超高质量题单 + 题解(ACM / OI)超高质量题解

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我新写的超高质量的题解和代码,题目难度不 ...

  9. 解题报告(三)多项式求值与插值(拉格朗日插值)(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  10. 解题报告(十三)中国剩余定理(ACM / OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

最新文章

  1. 导航菜单:jQuery粘性滚动导航栏效果
  2. 世纪联华的 Serverless 之路
  3. Oracle修改redo log大小的方法
  4. Mybatis中查询结果resultMap使用分析
  5. 【英语学习】【Level 08】U01 Let's Read L4 Hot off the press
  6. java 判断文件是否打开过_【后端开发】Java中如何判断文件是否被隐藏?(代码示例)...
  7. 查看端口占用情况lsof,并关闭对应进程kill
  8. 如何经由PHP获得MySQL procedure结果
  9. Android替换开机动画
  10. STM32CubeMX——霍尔编码器、L298N驱动电机
  11. stm8s + si4463 寄存器配置
  12. 联想拯救者Y7000关闭触摸板
  13. 无法关闭计算机xp,WindowsXP电脑无法关机的解决方法
  14. 航测大数据量处理_上海无人机航测收费标准大数据应用中心
  15. 100家大公司java笔试题汇总
  16. stm32L451比较器使用
  17. umijs配置eslint,prettier,stylelint,commitlint
  18. web前端开发(一)
  19. 无向图判断是否为欧拉回路(以HDU1878为板子题)
  20. Home Assistant 基于EZSP Zigbee Dongle创建Zigbee智能家居系统

热门文章

  1. 对 Python 代码使用的词语标记化器 tokenize,你懂了吗?【Python|标准库|tokenize】
  2. Android 应用集成友盟统计
  3. nuxt如何添加背景图片
  4. 2021年化工自动化控制仪表考试题库及化工自动化控制仪表报名考试
  5. 玩转Redis-8种数据淘汰策略及近似LRU、LFU原理
  6. 百钱买百鸡问题的解法与思路
  7. HDLC协议的基本概念和帧
  8. 什么是SysWow64,什么是System32
  9. 数码管显示原理——MCU51
  10. sin40度不用计算机怎么求,sin40度怎么算 sin40度如何算