给定数字n,m(1<=n,m<=500000)

将n变为n*2花费2,将n变为n-3花费3,要求过程中所有数字都在[1,500000]区间内。

求将n变为m的最少花费

思路:建图

将每个数字视为图中的点,数字之间的转换视为图中的边,有向图。

500000个点,(i,i*2)权值为2,(i,i-3)权值为3

转换为求n至m的最短路径

 #include <bits/stdc++.h>
using namespace std;
const long long INF = 0x3f3f3f3f3f3f3f3f;
int n,m;
vector<pair<long long,int>> edge[];
long long dis[];
typedef pair<long long,int> P;//first 最短距离,second顶点编号 void dijkstra(int s)
{
memset(dis,INF, sizeof(dis));
priority_queue<P,vector<P>,greater<P>> que; //最小堆
que.push(P(,s));
dis[s]=;
while(que.size())
{
P p=que.top();que.pop();
int v = p.second;
//vis[v]=1;
if(dis[v]<p.first)continue;
for(int i=;i<edge[v].size();i++)
{
int to = edge[v][i].second;
long long cost = edge[v][i].first;
//if(!vis[to]&&dis[to]>dis[v]+cost)
if(dis[to]>dis[v]+cost)
{
dis[to]=dis[v]+cost;
que.push(P(dis[to],to));
}
}
}
if(dis[m]==INF)
cout<<-<<endl;
else
cout<<dis[m];
} int main() {
cin >> n >> m;
for (int i = ; i <= ; i++)
{
if(*i<)
edge[i].push_back(make_pair(,*i));
if(i->)
edge[i].push_back(make_pair(,i-));
}
dijkstra(n);
return ;
}

思路2:暴力BFS

 #include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
typedef long long LL;
int n,m;
struct node
{
int x;
LL cost;
};
int vis[]; int main() {
cin >> n >> m;
node cur,now;
cur.x=n,cur.cost=;
queue<node> q;
q.push(cur);
LL ans=1e18;
vis[cur.x]=;
while(q.size())
{
now=q.front();q.pop();
if(now.x==m)
{
ans=min(ans,now.cost);
continue;//剪枝
}
cur.x=now.x*;
cur.cost=now.cost+;
if(cur.x<=&&!vis[cur.x])
{
vis[cur.x]=;
q.push(cur);
}
cur.x=now.x-;
cur.cost=now.cost+;
if(cur.x>&&!vis[cur.x])
{
vis[cur.x]=;
q.push(cur);
}
}
if(ans==1e18) printf("-1\n");
else cout<<ans<<endl;
return ;
}

CDOJ 1964 命运石之门【最短路径Dijkstra/BFS】的更多相关文章

  1. UESTC-1964命运石之门(类似SPFA的BFS)

    命运石之门 Time Limit: 1000 MS     Memory Limit: 256 MB Submit Status "这一切都是命运石之门的选择!" 凶真博士发明了能 ...

  2. 理解最短路径-Dijkstra算法

    最短路径—Dijkstra算法和Floyd算法 透彻理解迪杰斯特拉算法 Dijkstra算法的使用条件:图中不存在负权边. ---------------------------有待验证------- ...

  3. 最短路径问题,BFS,408方向,思路与实现分析

    最短路径问题,BFS,408方向,思路与实现分析 继上回挖下的坑,不知道大家有没有认真看最小生成树呢?很简单,这回也讲讲正常难度的,看不懂就来这里看看,讲的很好~~ 最短路径问题 说起这个问题,先说个 ...

  4. 最短路径 dijkstra

    最短路径 dijkstra #include <stdio.h> #include <string.h> #include <limits.h> #define M ...

  5. 网络最短路径Dijkstra算法

    最近在学习算法,看到有人写过的这样一个算法,我决定摘抄过来作为我的学习笔记: <span style="font-size:18px;">/* * File: shor ...

  6. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  7. 单源最短路径Dijkstra算法,多源最短路径Floyd算法

    1.单源最短路径 (1)无权图的单源最短路径 /*无权单源最短路径*/ void UnWeighted(LGraph Graph, Vertex S) { std::queue<Vertex&g ...

  8. 最短路径——Dijkstra算法和Floyd算法

    Dijkstra算法概述 Dijkstra算法是由荷兰计算机科学家狄克斯特拉(Dijkstra)于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图(无 ...

  9. 最短路径-Dijkstra算法与Floyd算法

    一.最短路径 ①在非网图中,最短路径是指两顶点之间经历的边数最少的路径. AE:1    ADE:2   ADCE:3   ABCE:3 ②在网图中,最短路径是指两顶点之间经历的边上权值之和最短的路径 ...

随机推荐

  1. 【BZOJ 2119】股市的预测(SAM)

    SAM很好用的啊... 传送门 双倍经验:L-Gap Substrings 基本做法类似,这道题的差分改掉,map 改掉就好了QWQ noteskey 反正就是先差分一下,然后把首项丢掉(没有比较的对 ...

  2. sqlserver 2012 分页

    --2012的OFFSET分页方式 select number from spt_values where type='p' order by number offset 10 rows fetch ...

  3. ansible笔记(8):常用模块之系统类模块(二)

    ansible笔记():常用模块之系统类模块(二) user模块 user模块可以帮助我们管理远程主机上的用户,比如创建用户.修改用户.删除用户.为用户创建密钥对等操作. 此处我们介绍一些user模块 ...

  4. percona-xtrabackup工具实现mysql5.6.34的主从同步复制

    percona-xtrabackup工具实现mysql5.6.34的主从同步复制 下载并安装percona-xtrabackup工具 # wget https://www.percona.com/do ...

  5. python-函数入门(二)

    一.函数对象 什么是函数? 函数是第一类对象,指的是函数名指向的值(函数)可以被当做数据去使用 1.函数的特性 1.函数可以被引用,即函数可以把值赋值给一个变量 def foo(): print('f ...

  6. MQ选型之RabbitMQ

    RabbitMQ是部署最广泛的开源消息代理.[官方原话] 前言: MQ 是什么?队列是什么,MQ 我们可以理解为消息队列(message queue),队列我们可以理解为管道.以管道的方式做消息传递. ...

  7. 【进阶1-2期】JavaScript深入之执行上下文栈和变量对象(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/hZIpnkKqdQgQnK1BcrH6Nw 阅读笔记 JS是单线程的语言,执行顺序肯定是顺 ...

  8. http之cdn介绍

    百度百科:CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能 ...

  9. LeetCode(86):分隔链表

    Medium! 题目描述: 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: hea ...

  10. LeetCode(2): 两数相加

    本内容为LeetCode第二道题目:两数相加 # -*- coding: utf-8 -*- """ Created on Sun Mar 10 10:47:12 201 ...