炫酷路途

2024-06-17 20:48
文章标签 炫酷 路途

本文主要是介绍炫酷路途,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【题目描述】

小希现在要从寝室赶到机房,路途可以按距离分为N段,第i个和i+1个是直接相连的,只需要一秒钟就可以相互到达。

炫酷的是,从第i个到第i+2p个也是直接相连的(其中p为任意非负整数),只需要一秒钟就可以相互到达。

更炫酷的是,有K个传送法阵使得某些u,v之间也是直接相连的,只需要一秒钟就可以相互到达,当然,由于设备故障,可能会有一些u=v的情况发生。

现在小希为了赶路,她需要在最短的时间里从寝室(编号为1)到达机房(编号为N),她不希望到达这N个部分以外的地方(不能到达位置N+1),也不能走到比自己当前位置编号小的地方(比如从5走到3是非法的)。

她想知道最短的时间是多少。

【输入描述】

第一行输入两个整数N,K,表示路途的段数和传送法阵的数量。

从第二行开始K行,每行两个整数ai,bi表示两个位置之间相连。

2≤N≤1,000,000,000
0≤K≤15

【输出描述】

输出一个整数,表示从寝室到机房最短的时间是多少秒。

【样例】

示例1

输入
12 2
1 5
6 6
输出
3

示例2

输入
17 2
2 5
8 9
输出
1

思路:

n 很大很吓人但其实影响不大,实际上将所有额外连边的 k*2 个点再加上起点、终点就可以构成一张图,最多只有 32 个点,然后计算两点间的距离求最短路即可

【源代码】

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<map>
#define PI acos(-1.0)
#define E 1e-6
#define INF 0x3f3f3f3f
#define N 3001
#define LL long long
const int MOD=1e9+7;
using namespace std;
int n,m;
struct Edge{int x,y;
}edge[N];
struct Node{int x,w;Node(){}Node(int x,int w):x(x),w(w){}bool operator < (const Node &rhs)const{return w>rhs.w;}
};
vector<int> mp;//图
int G[N][N];//边权
int res[N];
bool vis[N];
int bit(int x){//计算x中1的个数int cnt=0;while(x){if(x&1)cnt++;x>>=1;}return cnt;
}
int calculate(int x){//计算图中第一个大于等于x的位置return lower_bound(mp.begin(),mp.end(),x)-mp.begin();
}
void dijkstra(){memset(res,INF,sizeof(res));res[0]=0;priority_queue<Node> Q;Q.push(Node(0,0));while(!Q.empty()){int x=Q.top().x;int w=Q.top().w;Q.pop();vis[x]=true;for(int y=0;y<mp.size();y++){if(!vis[y]&&w+G[x][y]<res[y]){res[y]=w+G[x][y];Q.push(Node(y,res[y]));}}}
}
int main(){cin>>n>>m;int cnt=0;for(int i=0;i<m;i++){int x,y;cin>>x>>y;if(x!=y&&x<=n&&y<=n){if(x>y)//序号小者在前,保证边是有向的swap(x,y);//存点mp.push_back(x);mp.push_back(y);//存边edge[cnt].x=x;edge[cnt].y=y;cnt++;}}mp.push_back(1);//起点mp.push_back(n);//终点sort(mp.begin(),mp.end());mp.erase(unique(mp.begin(),mp.end()),mp.end());//去重//计算边权memset(G,INF,sizeof(G));for(int i=0;i<mp.size();i++)for(int j=i+1;j<mp.size();j++)G[i][j]=min(G[i][j],bit(mp[j]-mp[i]));for(int i=0;i<cnt;i++)G[calculate(edge[i].x)][calculate(edge[i].y)]=min(G[calculate(edge[i].x)][calculate(edge[i].y)],1);dijkstra();cout<<res[mp.size()-1]<<endl;return 0;
}

 

这篇关于炫酷路途的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

HTML 实现炫酷选项卡效果

在前端开发中,创造出吸引人的交互效果能够极大地提升用户体验。今天,我将分享一段使用 HTML 和 CSS 实现的炫酷选项卡代码,并详细介绍其实现过程。 一、效果展示 我们的选项卡效果具有以下特点: 整体布局美观大方,页面居中显示。选项卡标签颜色鲜艳,分别为紫色(#a55eea)、蓝色(#45aaf2)和绿色(#26de81),且带有圆角边框和白色文字,鼠标悬停时透明度变为 0.7,增加交互反

蓝色炫酷碎粒子HTML5导航源码

源码介绍 蓝色炫酷碎粒子HTML5导航源码,源码由HTML+CSS+JS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面,重定向这个界面 效果预览 源码获取 蓝色炫酷碎粒子HTML5导航源码

使用b站开源弹幕引擎实现炫酷的弹幕效果

转载请注明出处 作者:AboutJoke ( http://blog.csdn.net/u013200308 ) 原文链接:http://blog.csdn.net/u013200308/article/details/57123100 现在各大视屏网站都有了弹幕功能,但显示效果最好的非b站莫属了。如果你也想拥有和b站一样炫酷的弹幕效果,那么就跟着我来一步步实现。 首先放上地址 h

《Linux操作系统》vim配置与使用 - 超级炫酷的配置vim文件

方法一: 1.打开终端,在命令行中输入命令 cd /etc/vim/ 后敲回车,进入/etc/vim目录; 2.进入etc/vim目录后,找到vimrc文件(vim的初始化文件),使用cp命令对其进行备份,命令为: sudo cp vimrc vimrc.bak //备份是一种安全机制,要谨记 3.用管理员权限打开vimrc,命令为:sudo vi vimrc 4.打开后,在vimrc文件最后

别找AE模板了,这10个ae模板网站,小白也能做出炫酷视频

上次把免费且优质的视频素材网站做成了一个合集,从人物风景 影视剧片段 到 3d素材等等依次做了汇总,并列出了版权说明。 别囤了!这些视频素材网站,绝对值得收藏! 而如果你想在短期内又快又好地制作视频,使用别人做好的AE 视频模板,无疑是最方便的技巧。这次给大家整理了好用的 AE 模板网站,国内国外都有(国外没有版权问题)并以一个Ae模板为例,介绍使用模板时可能会遇到的问题及对应的解决方

Ant-Design-Vue快速入门+排坑全攻略:打造炫酷Vue应用的s实用指南!

Ant-Design-Vue 是一个基于 Vue.js 的高质量 UI 组件库,适用于企业级后台产品的快速开发。下面将提供一份快速上手指南,并分享一些常见的“坑”和解决方案。 一、Ant-Design-Vue 快速上手指南 1. 安装与引入 确保安装了 Node.js(推荐使用最新的稳定版)。 使用 npm 或 yarn 安装 Ant-Design-Vue。 # 使用 npm npm

分享小诗梦404炫酷单页面html5源码

源码介绍 分享小诗梦404炫酷单页面html5源码,小诗梦的一个很炫酷页面,感觉应该符合一些人的感觉!可以用来做404页面。 源码下载 分享小诗梦404炫酷单页面html5源码

WPF炫酷界面设计

一.效果展示(多层次) 二.制作流程 1.在vs2012中建立一个wpf程序 2.建立一个主页面(.cs)(注:C#程序每一个页面都由两个文件构成一个axml一个cs,一个前端文件一个后台文件) 3.在主页面中添加按钮,按钮中嵌入图片,这样就可以在在后台动态更改界面显示的效果,每次点击都更改图片,显示出不同的图片 4.在主页面中添加

推荐3个高级设计师都在用的小众网站,效果贼拉炫酷

今天给大家推荐三个可以提升设计质感的网站,效果贼拉炫酷。 第一个:Gradientor 这是一个在线生成渐变图片的网站,只需在上面上传SVG格式的图片,画布就能根据图片内容自动生成渐变效果,也可以在画布里用鼠标直接绘制,但由于渐变的方向是垂直的,所以纵向笔画后被隐藏。它可以调整画布尺寸和渐变颜色,也可以调整渐变的范围,还可以给生成的效果增加噪点,提升质感。如果对当前生成的效果不满意,也可以撤销

Qt Quick实现一个炫酷的折叠动画效果

demo来自 https://github.com/cjmdaixi/FlipAnimation 代码上传到了 csdn 文章目录 效果图核心代码从中学习到了什么ShaderEffectSourceFlipable 感谢无私奉献的人 效果图 可以动态配置折叠次数 核心代码 FlipCards.qml import QtQuick 2.9import QtQuick.C