|
|
|
@ -1,7 +1,7 @@
|
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
using namespace std;
|
|
|
|
|
const int N = 10010, M = N << 1, K = 110; // 节点个数上限,边数上限,发车间隔时长上限
|
|
|
|
|
const int INF = 0x3f3f3f3f; // Dijsktra专用正无穷
|
|
|
|
|
const int INF = 0x3f3f3f3f;
|
|
|
|
|
|
|
|
|
|
struct Node {
|
|
|
|
|
int u, r, d; // u节点编号,r状态,d最短到达时间
|
|
|
|
@ -22,14 +22,14 @@ dis[u][i]表示到达第u处地点,并且到达时间mod k = i的情况下的
|
|
|
|
|
*/
|
|
|
|
|
int dis[N][K], st[N][K];
|
|
|
|
|
int main() {
|
|
|
|
|
memset(h, -1, sizeof h);
|
|
|
|
|
memset(h, -1, sizeof h); // 初始化链式前向星
|
|
|
|
|
|
|
|
|
|
int n, m, k;
|
|
|
|
|
cin >> n >> m >> k;
|
|
|
|
|
for (int i = 0; i < m; i++) {
|
|
|
|
|
while (m--) {
|
|
|
|
|
int a, b, c;
|
|
|
|
|
cin >> a >> b >> c;
|
|
|
|
|
add(a, b, c); // 从a到b建一条边,c权值为开放时间
|
|
|
|
|
add(a, b, c); // 从a到b建一条边,c为此路径的开放时间
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 初始状态,1号点在状态0时最短距离为0,其它点的最短距离为无穷大
|
|
|
|
@ -49,14 +49,15 @@ int main() {
|
|
|
|
|
int r = q.top().r; // 节点状态r
|
|
|
|
|
q.pop();
|
|
|
|
|
|
|
|
|
|
if (st[u][r]) continue; // 该状态已经加入到集合中,也就是已经被搜索过
|
|
|
|
|
if (st[u][r]) continue;
|
|
|
|
|
// 该状态已经加入到集合中,也就是已经被搜索过
|
|
|
|
|
// 先被搜索过在队列宽搜中意味着已经取得了最短路径
|
|
|
|
|
st[u][r] = 1;
|
|
|
|
|
|
|
|
|
|
for (int i = h[u]; ~i; i = ne[i]) { // 枚举邻接点v和连接到v节点道路的开放时间
|
|
|
|
|
int v = e[i]; // v节点,也就是下一个节点
|
|
|
|
|
int t = w[i]; // v节点的开放时间
|
|
|
|
|
int d = dis[u][r]; // 到达(u,p)这个状态时的最短距离d
|
|
|
|
|
int d = dis[u][r]; // 到达(u,r)这个状态时的最短距离d
|
|
|
|
|
int j = (r + 1) % k; // v节点的状态应该是u节点的状态+1后再模k
|
|
|
|
|
|
|
|
|
|
// 如果到达时间小于开放时间,则将到达时间向后延长若干个k的整数倍(向上取整)
|
|
|
|
|