题意:有向图有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;
}

  

POJ - 1847 Tram(dijkstra)的更多相关文章

  1. POJ 1847 Tram (最短路径)

    POJ 1847 Tram (最短路径) Description Tram network in Zagreb consists of a number of intersections and ra ...

  2. POJ 1847 Tram (最短路)

    Tram 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/N Description Tram network in Zagreb ...

  3. (简单) POJ 1847 Tram,Dijkstra。

    Description Tram network in Zagreb consists of a number of intersections and rails connecting some o ...

  4. 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

    迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...

  5. 最短路径之迪杰斯特拉(Dijkstra)算法

    迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...

  6. POJ 2431 Expedition(探险)

    POJ 2431 Expedition(探险) Time Limit: 1000MS   Memory Limit: 65536K [Description] [题目描述] A group of co ...

  7. 理解最短路径——迪杰斯特拉(dijkstra)算法

    原址地址:http://ibupu.link/?id=29 1.       迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...

  8. POJ 3414 Pots(罐子)

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

  9. POJ 3281 Dining (网络流)

    POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...

随机推荐

  1. 【JavaWeb】导入Excel并进行校验

    一.需要实现的目标 1.界面编写 2.导入表读取表名,进行校验,后台匹配(判断此表的名称是否能够模糊匹配上) 3.确定表存在,读取其中的数据,暂存 4.正则表达式数据校验(判断是否已存在,数据是否符合 ...

  2. CURL_模拟登录

    <?php $curl = curl_init(); $url = "http://www.imooc.com/user/login"; //$url = "htt ...

  3. 纪录片- 睡眠追踪(Chasing sleep) (共6集)

    传送门:https://www.bilibili.com/bangumi/play/ep120260/ 小贴士传送门:https://www.bilibili.com/video/av11887055 ...

  4. JavaScript判断两个对象内容是否相等

    ES6中有一个方法判断两个对象是否相等,这个方法判断是两个对象引用地址是否一致 let obj1= { a: 1 } let obj2 = { a: 1 } console.log(Object.is ...

  5. GO 空白标识符 _

    空白标识符 _ 也被用于抛弃值,如值 5 在:_, b = 5, 7 中被抛弃. _ 实际上是一个只写变量,你不能得到它的值.这样做是因为 Go 语言中你必须使用所有被声明的变量,但有时你并不需要使用 ...

  6. 最优矩阵连乘问题 区间DP

    最优矩阵连乘积 Accepted: 10 Total Submit: 18Time Limit: 1000ms Memony Limit: 32768KB Description 在科学计算中经常要计 ...

  7. Ionic3记录之核心代码分析

    app.module.ts app的根模块,一些插件的引用需要在这里声明,告诉APP如何组装应用: app.componet.ts app的根组件,主要用来APP启动时和启动后的操作;

  8. 四、linux基础-系统目录_安装_相关命令_调度

    4 系统目录-安装-版本4.1系统目录Linux的文件系统是采用级层式的树状目录结构,在此结构中的最上层是根目录“/”,然后在此目录下再创建其他的目录. 在装完Linux系统以后会自动生成一下等目录, ...

  9. springmvc常用注解详解

    1.@Controller 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ...

  10. 笔记||Python3进阶之装饰器

    # 装饰器# 特征: 是用一个@开头的字符串# 装饰器通常用来装饰函数.或者类的方法# 被装饰后的函数,通常是在原有的函数基础上,会多出增加一点功能# 一般来说装饰器本身也是一个函数## def te ...