85ptsWA代码求调
查看原帖
85ptsWA代码求调
717781
zsyzsy_2012楼主2023/11/2 20:54
#include <bits/stdc++.h>
#define int long long
#define N 1000010
using namespace std ;
const int inf = (int)2e18 ;
typedef pair<int , int> pii ;
int n , m , k , dis[N] , vis[N] ;
struct node {
	int u , t ;
};
vector<node>g[N] ;
priority_queue<pii , vector<pii> , greater<pii> >q ;
signed main() {
	scanf("%lld%lld%lld" , &n , &m , &k) ;
	for(int i = 1 ; i <= m ; i++) {
		int u , v , a ;
		scanf("%lld%lld%lld" , &u , &v , &a) ;
		for(int j = 0 ; j < k ; j++) {
			g[j * n + u].push_back((node){(j + 1) % k * n + v , a}) ;
		}
	}
	for(int i = 1 ; i <= n * k ; i++) {
		dis[i] = inf ;
	}
	q.push(make_pair(0 , 1)) ;
	dis[1] = 0 ;
	while(q.size()) {
		pii p = q.top() ; q.pop() ;
		if(vis[p.second]) continue ;
		vis[p.second] = 1 ;
		for(int i = 0 ; i < (int)g[p.second].size() ; i++) {
			node now = g[p.second][i] ;
			int tmp = dis[p.second] + 1 ;
			if(now.t > tmp) {
				tmp += (int)ceil(1.0 * (now.t - tmp) / k) * k ;
			}
			if(tmp < dis[now.u]) {
				dis[now.u] = tmp ;
				if(vis[now.u]) continue ;
				q.push(make_pair(tmp , now.u)) ;
			}
		}
	}
	if(dis[n] == inf) puts("-1") ;
	else printf("%lld" , dis[n]) ;
	return 0 ;
}

思路很简单,就是分层图+dijkstra , 应该能看懂吧

2023/11/2 20:54
加载中...