一、题目描述
二、算法分析说明与代码编写指导
根据题目描述,所有交叉路口的开关指向列出的第一个路口编号。如果火车直接经过该路口到达默认指向的第一个交叉路口,则不用掰开关,次数不增加。经过该路口到达其它路口,则需要扳动一次开关。因此,建立一个图,顶点编号 1 到 N 分别对应交叉路口 1 到 N。第 i 个路口可以通向 Ki 个其它路口,开关指向第一个路口 j,则 i 到 j 有一条权为 0 的边。i 到 剩下的路口各有 1 条权为 1 的边。用 Dijkstra 算法跑一次以 a 为源点的最短路,最后取 d[b] 作为答案。
如果无法从路口 a 到达路口 b,输出 -1。
三、AC 代码
#include<cstdio>
#include<vector>
#include<algorithm>
#include<bitset>
#pragma warning(disable:4996)
using namespace std;
const unsigned nmax = 101;
unsigned n, N, a, b, k, t[nmax], x, y; vector<unsigned> G[nmax