POJ - 1847 Tram(dijkstra)
题意:有向图有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)的更多相关文章
- POJ 1847 Tram (最短路径)
POJ 1847 Tram (最短路径) Description Tram network in Zagreb consists of a number of intersections and ra ...
- POJ 1847 Tram (最短路)
Tram 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/N Description Tram network in Zagreb ...
- (简单) POJ 1847 Tram,Dijkstra。
Description Tram network in Zagreb consists of a number of intersections and rails connecting some o ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- POJ 2431 Expedition(探险)
POJ 2431 Expedition(探险) Time Limit: 1000MS Memory Limit: 65536K [Description] [题目描述] A group of co ...
- 理解最短路径——迪杰斯特拉(dijkstra)算法
原址地址:http://ibupu.link/?id=29 1. 迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...
- POJ 3414 Pots(罐子)
POJ 3414 Pots(罐子) Time Limit: 1000MS Memory Limit: 65536K Description - 题目描述 You are given two po ...
- POJ 3281 Dining (网络流)
POJ 3281 Dining (网络流) Description Cows are such finicky eaters. Each cow has a preference for certai ...
随机推荐
- iOS 开发之 FMDB 源码分析
概念: FMDB 是用于数据存储的框架,它是 iOS 平台下对 SQLite 数据库的封装.FMDB 是面向对象的,它以 OC 的方式封装了 SQLite 的 C 语言 API,使用起来更加方便. C ...
- vue中加载three.js的gltf模型
vue中加载three.js的gltf模型 一.开始引入three.js相关插件.首先利用淘宝镜像,操作命令为: cnpm install three //npm install three也行 二. ...
- leetCode练题——21. Merge Two Sorted Lists(照搬大神做法)
1.题目 21. Merge Two Sorted Lists Merge two sorted linked lists and return it as a new list. The new l ...
- java判断文件或文件夹是否在
public static void main(String[] args) { File file = new File("G:\\Jeff.txt"); File dir = ...
- 了解Web的相关知识
一.WWW基础 WWW(world wide web, 万维网)是Internet上基于客户端/服务器体系结构的分布式多平台的超文本超媒体信息服务系统.它利用超文本(hypertext).超媒体(hy ...
- MySQL之正则
八:正则匹配: 语法: select * from 表名 where 字段名 regexp "正则表达式"; PS:MySQL中正则匹配,不能使用\w等字幕作为匹配
- K8s / Kubernetes 从入门到入门
Kubernetes介绍 1.背景介绍 云计算飞速发展 - IaaS - PaaS - SaaS Docker技术突飞猛进 - 一次构建,到处运行 - 容器的快速轻量 - 完整的生态环境 2.什么是k ...
- postman 使用post方式提交参数值
参考:https://www.cnblogs.com/haoxuanchen2014/p/7771459.html
- 02.Scala高级特性:第6节 高阶函数;第7节 隐式转换和隐式参数
Scala高级特性 1. 课程目标 1.1. 目标一:深入理解高阶函数 1.2. 目标二:深入理解隐式转换 2. 高阶函数 2.1. 概念 Scala混合了面向对象和函数式的特 ...
- vector的clear和swap
vector的clear()操作只是清空vector的元素,而不会将内存释放掉 vector<int> vec1{ 1,2,3,4,5 }; vec1.clear(); cout<& ...