求调,25pts,分层图用一维数组存的
查看原帖
求调,25pts,分层图用一维数组存的
1081824
LoveFrieren楼主2024/9/11 13:53
#include<bits/stdc++.h>
using namespace std;
const int M = 2e6 + 10; typedef pair<int, int> pii;
int n, m, cnt, k, nxt[M], to[M], h[M], vis[M], dis[M], tl[M];
priority_queue<pii, vector<pii>, greater<pii> > djk;//dis, node
int read() {
	int f = 1, a = 0;
	char c = getchar();
	while(c < '0' || c > '9') {
		if(c == '-') f = -1;
		c = getchar();
	}
	while(c >= '0' && c <= '9') {
		a = (a << 1) + (a << 3) + (c ^ 48);
		c = getchar();
	}
	return a * f;
}
void add(int u, int v, int w) {
	to[++cnt] = v;
	tl[cnt] = w;
	nxt[cnt] = h[u];
	h[u] = cnt;
}
void dijk() {
	memset(dis, 0x3f, sizeof(dis));
	dis[1] = 0;
	djk.push(make_pair(0, 1));
	while(!djk.empty()) {
		int u = djk.top().second; djk.pop();
		if(vis[u])continue;
		vis[u] = 1;
		for(int i = h[u]; i; i = nxt[i]) {
			int t = 0;
			if(dis[u] >= tl[i]) t = dis[u];
			else t = (tl[i] - dis[u] + k - 1) / k * k;
			if(dis[to[i]] > t + 1) {
				dis[to[i]] = t + 1;
				djk.push(make_pair(dis[to[i]], to[i]));
			}
		} 
	}
}
int main() {
	n = read(), m = read(), k = read();
	for(int i = 1, u, v, w; i <= m; ++i) {
		u = read(), v = read(), w = read();
		for(int j = 0; j < k; ++j) { 
			if(j == k - 1)//如果是最后一层
				add(u + n * j, v, w);
			else add(u + n * j, v + n * (j + 1), w);//一般情况
		}
	}
//	for(int i = 1; i <= k * n; ++i) {
//		cout << i << ": ";
//		for(int j = h[i]; j; j = nxt[j])
//			cout << to[j] << ' '; 
//		cout << endl;
//	}
	dijk();
//	for(int i = 1; i <= k * n; ++i) cout << dis[i] << ' ';
	if(dis[n] == 0x3f3f3f3f) cout << -1;
	else cout << dis[n];
	return 0;
}
2024/9/11 13:53
加载中...