题目描述


在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能)。在每个路口,都有一个开关决定着出去的轨道,每个开关都有一个默认的状态,每辆电车行驶到路口之后,只能从开关所指向的轨道出去,如果电车司机想走另一个轨道,他就必须下车切换开关的状态。

为了行驶向目标地点,电车司机不得不经常下车来切换开关,于是,他们想请你写一个程序,计算一辆从路口A到路口B最少需要下车切换几次开关。

输入格式:


第一行有3个整数2<=N<=100,1<=A,B<=N,分别表示路口的数量,和电车的起点,终点。

接下来有N行,每行的开头有一个数字Ki(0<=Ki<=N-1),表示这个路口与Ki条轨道相连,接下来有Ki个数字表示每条轨道所通向的路口,开关默认指向第一个数字表示的轨道。

输出格式:


输出文件只有一个数字,表示从A到B所需的最少的切换开关次数,若无法从A前往B,输出-1。

题解


题目一股本子的气息 / 《电车之狼》 什么的
对于默认的路线连边权为0,其他的作1,跑一遍最短路就可以了
注意自环坑人

Code


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <numeric>
#include <iomanip>
#include <bitset>
#include <sstream>
#include <fstream>
#define debug puts("-----")
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)
#define fill(x, t) memset(x, t, sizeof(x))
#define min(x, y) x<y?x:y
#define max(x, y) x>y?x:y
#define PI (acos(-1.0))
#define EPS (1e-8)
#define INF (1<<30)
#define ll long long
#define db double
#define ld long double
#define N 1001
#define E N * 8 + 1
#define L 255
using namespace std;
struct edge{int x, y, w, next;}e[E];
int inQueue[N], dis[N], tis[N], ls[N];
int edgeCnt;
inline int read(){int x = 0, v = 1;char ch = getchar();while (ch < '0' || ch > '9'){if (ch == '-'){v = -1;}ch = getchar();}while (ch <= '9' && ch >= '0'){x = (x << 1) + (x << 3) + ch - '0';ch = getchar();}return x * v;
}
inline int addEdge(int &cnt, const int &x, const int &y, const int &w = 1){e[++ cnt] = (edge){x, y, w, ls[x]}; ls[x] = cnt;return 0;
}
inline int spfa(const int &st, const int &ed, const int &n){fill(inQueue, 0);inQueue[st] = 1;fill(dis, 63);dis[st] = 0;fill(tis, 0);queue<int>q;q.push(st);while (!q.empty()){int now = q.front(); q.pop();if (++ tis[now] >= n){return -1;}for (int i = ls[now]; i; i = e[i].next){if (dis[now] + e[i].w < dis[e[i].y]){dis[e[i].y] = dis[now] + e[i].w;if (!inQueue[e[i].y]){inQueue[e[i].y] = 1;q.push(e[i].y);}}}inQueue[now] = 0;}if (dis[ed] == dis[0]){dis[ed] = -1;}return dis[ed];
}
int main(void){int n = read(), st = read(), ed = read();edgeCnt = 1;rep(i, 1, n){int opt = read();rep(j, 1, opt){int tar = read();if (tar != i){addEdge(edgeCnt, i, tar, j != 1);}}}printf("%d\n", spfa(st, ed, n));return 0;
}

电车_洛谷1346_最短路相关推荐

  1. 洛谷 1144 最短路计数 bfs

    洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...

  2. python高精度乘法_洛谷P1919--A*B Problem升级版(NTT优化高精度乘法)

    题目背景 本题数据已加强,请使用 FFT/NTT,不要再交 Python 代码浪费评测资源. 题目描述 给你两个正整数 a,b,求$ a \times b$. 输入格式 第一行一个正整数,表示 a: ...

  3. java 旅行家的预算_洛谷 P1016 旅行家的预算 Java解法

    洛谷 P1016 旅行家的预算 Java解法 洛谷 P1016 旅行家的预算 Java解法 package com.two; import java.util.Scanner; public clas ...

  4. c语言倒序输出单词_洛谷 || 单词覆盖还原(C语言)

    点击上方「蓝字」关注"程序员Bob" 每天与你不见不散! 每日一句,送给最珍贵的你: 诱人的机会总是转瞬即逝的.真正好的投资机会不会经常有,也不会持续很长的时间,所以你必须做好行动 ...

  5. python冰雹猜想_洛谷-P5727 【深基5.例3】冰雹猜想

    洛谷-P5727 [深基5.例3]冰雹猜想 给出一个正整数 \(n(n\le 100)\),然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 再加 1,否则除以 2.经过若干次循环 ...

  6. 洛谷 P2384 最短路题解

    题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你100000000000000000000000000000000000%10金币w ...

  7. 洛谷 P1144 最短路计数 dijkstra

    https://www.luogu.org/problem/P1144 题目描述 给出一个NNN个顶点MMM条边的无向无权图,顶点编号为1−N1−N1−N.问从顶点111开始,到其他每个点的最短路有几 ...

  8. 洛谷——P2384 最短路

    P2384 最短路 题目背景 狗哥做烂了最短路,突然机智的考了Bosh一道,没想到把Bosh考住了...你能帮Bosh解决吗? 他会给你10000000000000000000000000000000 ...

  9. c语言怎么将n个数字存入到数组中_洛谷 || 拼数(C语言)

    点击这里关注"程序员Bob" Success does not consist in never making mistakes but in never making the s ...

最新文章

  1. 翻译:FireBug 1.10 新特性
  2. mac搭建ios自动化环境之WebDriverAgent配置
  3. Java的知识点25——IO、 数据源
  4. 豆瓣9.2!为什么这款剧最能打动大家?真相都在数据里!
  5. update 后面能接子查询吗_只用身份证能查询CPA成绩吗?查询步骤不能忘
  6. spring 面向接口编程_Spring面向方面的编程
  7. 灰度重采样(Gray Resampling
  8. python 安装中的错误解决
  9. CISSP ALL in One 生词汇总
  10. php flush 逐行显示_PHP逐行输出(ob_flush与flush的组合)
  11. SQL存储过程与自定义函数实例
  12. tensorflow 小于_TensorFlow做Sparse Machine Learning
  13. VBS 控制 Windos 系统音量 及视频播放
  14. 分治法 —— 循环比赛日程安排表
  15. matlab绘制s域零极点分布图,《信号与系统》第五章 连续系统的s域分析.ppt
  16. 易语言安卓模拟器adb模块制作查看模拟器设备adb devices
  17. 印象笔记无法连接服务器解决办法
  18. 大数据开发之安装mysql
  19. java课程论文_Java课程论文.doc
  20. windows oracle out of memory,windows 32位ORA-27102: out of memory错误

热门文章

  1. 66道面试逻辑智力测试题
  2. 消息队列和延迟消息队列
  3. 解决Android Studio使用过程中虚拟机无响应,无法关机:
  4. android判断推送权限,iApp检查与获取推送权限
  5. PC电脑系统上投屏、投影的鼠标相应速度优化方法
  6. 海信发布中国首款社交电视,可唱K拍照测颜值
  7. 移动CRM系统让销售工作更顺利展开
  8. js嵌套数组展平和判断数组方法
  9. php mysql 条件查询输出,php查询mysql多条件判断输出显示
  10. java -- generator_code代码生成器