给定一个 n 个点 m 条边的不含重边和自环的无向图。 点的编号为 1∼n ,边的编号为 1∼m 。 在 t=0 时刻,你位于 1 号点。 你的任务是尽可能早的抵达 n 号点。 第 i 条边连接点 ai 和点 bi ,通过此边需要花费的时间为 ci 。 在整个移动过程中,你只有在整数时刻才能离开某一点前往另一点。 此外,第 i 个点有 ki 个禁止离开时刻。 在每个点的禁止离开时刻,你无法离开该点前往其它点。 请你计算抵达 n 号点的最早可能时刻。 输入格式 第一行包含两个整数 n,m 。 接下来 m 行,其中第 i 行包含三个整数 ai,bi,ci ,表示第 i 条边连接点 ai 和 bi ,通过此边需要花费的时间为 ci 。 接下来 n 行,其中第 i 行首先包含一个整数 ki ,表示第 i 个点有 ki 个禁止离开时刻,随后包含 ki 个互不相同的升序排序的整数 tij ,表示所有禁止离开时刻。 输出格式 一个整数,表示抵达 n 号点的最早可能时刻。 如果无法抵达 n 号点,则输出 -1。 数据范围 前 4 个测试点满足 2≤n≤4 。 所有测试点满足 2≤n≤105 ,0≤m≤105 ,1≤ai,bi≤n ,ai≠bi ,1≤ci≤104 ,0≤ki≤105 ,0≤tij<109 ,所有 ki 相加之和不超过 105 。
时间: 2023-04-08 15:01:00 浏览: 300
这是一个算法问题,我可以回答。这道题可以用 Dijkstra 算法求解,具体步骤如下:
1. 初始化距离数组 dist,将所有点的距离初始化为正无穷,将起点 1 的距离初始化为 0。
2. 初始化堆,将起点 1 加入堆中。
3. 不断从堆中取出距离最小的点 u,遍历 u 的所有邻居 v,如果 dist[u]+w(u,v) 的值比 dist[v] 小,则更新 dist[v] 的值,并将 v 加入堆中。
4. 重复步骤 3 直到堆为空或者堆顶为终点 n。
5. 如果 dist[n] 的值为正无穷,则表示无法到达终点,否则 dist[n] 的值即为最短时间。
需要注意的是,在遍历邻居时需要判断当前时间是否为禁止离开时刻,如果是则不能移动。
时间复杂度为 O(mlogn),其中 m 为边数,n 为点数。
阅读全文