15分求条
查看原帖
15分求条
1426450
mt19938楼主2024/10/5 16:57
#include <bits/stdc++.h>
using namespace std;
#define int long long
//P9751 [CSP-J 2023] 旅游巴士(bus)
const int N=1e4+7,M=2e4+6,K=1e2+3,inf=0x3f3f3f3f3f3f3f3fll;
struct Edge{
	int v,w,nxt;//从u到v,开放时间w
}e[M];
struct node{
	int idx,w,r;
	bool operator<(const node&u)const{return w<u.w;}
	node(int xx,int ww,int rr){idx=xx;w=ww;r=rr;}
};
int n,m,k,cnt,head[M],d[N][K],vis[N][K];
void add(int u,int v,int w){
	e[++cnt].v=v;
	e[cnt].w=w;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}
void dijkstra(int st){
	memset(d,0x3f,sizeof(d));
	priority_queue<node> pq;
	pq.push(node(st,0,0));
	d[st][0]=0;
	while(!pq.empty()){
		node no=pq.top();pq.pop();
		if(vis[no.idx][no.r])continue;
		vis[no.idx][no.r]=1;
		int u=no.idx,w=no.w,r=no.r;
		for(int i=head[u];i;i=e[i].nxt){
			int v=e[i].v,ew=e[i].w;
			if(ew>w){
				d[v][(r+1)%k]=min(d[v][(r+1)%k],d[u][r]+((ew-w+k-1)/k)*k+1);
				pq.push(node(v,((ew-w+k-1)/k)*k+1+w,(r+1)%k));
			}else{
				d[v][(r+1)%k]=min(d[u][r]+1,d[v][(r+1)%k]);
				pq.push(node(v,w+1,(r+1)%k));
			}
		}
	}
}
signed main(){
//	freopen("bus.in","r",stdin);
//	freopen("bus.out","w",stdout);
	cin>>n>>m>>k;
	for(int i=1;i<=m;i++){
		int u,v,w;cin>>u>>v>>w;
		add(u,v,w);
	}
	dijkstra(1);
	if(d[n][0]!=inf)cout<<d[n][0];
	else cout<<-1;
	return 0;
}

调了2h没出来qwq

2024/10/5 16:57
加载中...