题意:有向图有N个点,当电车进入交叉口(某点)时,它只能在开关指向的方向离开。 如果驾驶员想要采取其他方式,他/她必须手动更换开关。当驾驶员从路口A驶向路口B时,他/她尝试选择将他/她不得不手动更换开关的次数最小化的路线。

编写一个程序,该程序将计算从交点A到交点B所需的最小开关更改次数。第i个交点处的开关最初指向列出的第一个交点的方向。

分析:对于某点i,去往其直接可到达的点列表中的第一个点时不需要更换开关,等价于边长为0;而其他的点需要更换开关,等价于边长为1。dijkstra裸题。

#include<cstdio>
#include<map>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 100 + 10;
const int INF = 0x3f3f3f3f;
struct Edge{int from, to, dist;Edge(int f, int t, int d):from(f), to(t), dist(d){}
};
struct HeapNode{int d, u;HeapNode(int dd, int uu):d(dd), u(uu){}bool operator < (const HeapNode&rhs)const{return d > rhs.d;}
};
struct Dijkstra{int n, m;vector<int> G[MAXN];vector<Edge> edges;bool done[MAXN];int d[MAXN];int p[MAXN];void init(int n){this -> n = n;for(int i = 1; i <= n; ++i) G[i].clear();edges.clear();}void AddEdge(int from, int to, int dist){edges.push_back(Edge(from, to, dist));m = edges.size();G[from].push_back(m - 1);}void dijkstra(int s){priority_queue<HeapNode> q;for(int i = 1; i <= n; ++i) d[i] = INF;memset(done, false, sizeof done);d[s] = 0;q.push(HeapNode(0, s));while(!q.empty()){HeapNode top = q.top();q.pop();if(done[top.u]) continue;done[top.u] = true;int len = G[top.u].size();for(int i = 0; i < len; ++i){Edge e = edges[G[top.u][i]];if(d[top.u] + e.dist < d[e.to]){d[e.to] = d[top.u] + e.dist;p[e.to] = G[top.u][i];q.push(HeapNode(d[e.to], e.to));}}}}
}dij;
int main(){int N, A, B;scanf("%d%d%d", &N, &A, &B);dij.init(N);for(int i = 1; i <= N; ++i){int k, x;scanf("%d", &k);for(int j = 0; j < k; ++j){scanf("%d", &x);if(j == 0) dij.AddEdge(i, x, 0);else dij.AddEdge(i, x, 1);}}dij.dijkstra(A);if(dij.d[B] == INF) printf("-1\n");else printf("%d\n", dij.d[B]);return 0;
}

  

转载于:https://www.cnblogs.com/tyty-Somnuspoppy/p/9084352.html

POJ - 1847 Tram(dijkstra)相关推荐

  1. POJ 3414 Pots(罐子)

    POJ 3414 Pots(罐子) Time Limit: 1000MS    Memory Limit: 65536K Description - 题目描述 You are given two po ...

  2. 手撕迪杰斯特拉算法(Dijkstra)及代码(附图解)

    文章目录 迪杰斯特拉(Dijkstra)算法 1.算法思想及其步骤 2.代码 2.1 相关声明 2.2 有权图的建立函数定义 2.3 核心算法:迪杰斯特拉 迪杰斯特拉(Dijkstra)算法 引言:我 ...

  3. 迪克斯特拉(Dijkstra)算法之MATLAB实现

    by WC 1.12.2016 1. 迪克斯特拉(Dijkstra)算法 在网上面看了很多的解释,仍没有感觉到有非常通熟易懂的解释,在这里我为大家讲解一下,尽量避免枯燥难懂的数学公式. 狄克斯特拉算法 ...

  4. 迪杰斯特拉(Dijkstra)算法之两点之间的最短距离问题

    1.概述 (1)与弗洛伊德(Floyd)算法一样,迪杰斯特拉(Dijkstra)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,主要特点是以出发点为中心向外层层扩展(广度优先搜索思想),直到扩 ...

  5. Java图结构-模拟校园地图-迪杰斯特拉(Dijkstra)算法求最短路径 #谭子

    目录目录 一.前言 二.模拟校园地图描述 三.分析题目及相关绘图 四.代码部分 1.GraphNode类 2.Menu类(管理文字) 3.Attraction类 4.AttractionGraph类( ...

  6. 浅谈迪杰斯特拉(Dijkstra)算法和A*算法原理及实现

    写在前面 最近我在学习一门名叫<智能自主机器人及系统>的课程,虽然跟过去所学的<机器人学>在部分内容上有所重复,但该课程的应用性更强.对于不同的机器人,如差速轮式车.四轮车.四 ...

  7. 数据结构——迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉算法又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题.迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点 ...

  8. 最短路——小木乃伊到我家(dijkstra)

    题目链接 最短路--小木乃伊到我家(dijkstra) 题目描述 AA的欧尼酱qwb是个考古学家,有一天qwb发现了只白白圆圆小小的木乃伊,它是个爱哭鬼却很努力.qwb想把这么可爱的小木乃伊送给 AA ...

  9. 迪杰斯特拉算法(Dijkstra)求最短路径Python

    迪杰斯塔拉(Dijkstra)算法求最短路径 序 关于Dijkstra Dijkstra算法讲解 Dijkstra算法的弊端 第一步:进行初始化 第二步:主程序开始 又是初始化 核心的核心[^5] 最 ...

最新文章

  1. (75)内核APC执行过程,分析 KiDeliverApc 函数
  2. 11g rac生产环境异机恢复报错RMAN-6013
  3. 简单实现仿某宝地址选择三级联动样式
  4. 服务器的响应一直一直发送不过去,zeroRPC:在发送响应后继续运行进程
  5. 针对新手的Java EE7和Maven项目–第5部分–使用Arquillian / Wildfly 8进行单元测试
  6. MySQL查询数据字典_存储过程_函数_视图元数据_表元数据_触发器
  7. Effective C# 原则48:了解更多的工具和资源(译)
  8. Ztree手风琴效果(第三版)
  9. 最短Hamilton路径
  10. c语言上机题库大一,C语言上机题库(一).doc
  11. c51单片机学习笔记二
  12. 联想thinkpad E430c 重装系统之后无线连接显示红叉解决办法
  13. 桌面图标文字有蓝底怎么办
  14. java中两个数组的并集_Java数组并集
  15. 微信公众号聊天机器人
  16. 光盘复制-DVD光盘复制格式剖析
  17. Jsp:WebRoot与WebContent区别
  18. 51单片机(八).单片机的I2C与串口通讯
  19. 浅谈关于油麦菜的特性与如何种植优质品种的油麦菜
  20. Python进阶并发基础--线程,全局解释器锁GIL由来,如何更好的利用Python线程,

热门文章

  1. Java的超类/基类Object
  2. 蓝牙信号强度检测app_基于蓝牙技术的智能插座方案
  3. react 日历组件_anujs1.5.1支持React.Suspense与lazy
  4. opc调试软件_组态王和三菱OPC软件完美演绎天塔之光
  5. azdb文件怎么打开_AZDBExplorerSvcs.dll
  6. markdown 生成目录_github上如何为markdown文件生成目录
  7. LeetCode 面试题 03 数组中重复的数字
  8. python如何调用c函数实现真正意义的多线程_python如何使用多线程执行多个函数?...
  9. ospf工作原理_OSPF动态路由配置经典案例
  10. pat 乙级 1019 数字黑洞(C++)