dij求调
查看原帖
dij求调
540956
douweiqi楼主2023/11/18 20:22
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int N=1e6+10;
const int M=1e4+10;
const int Small=1e-8;
int n,m,k;
struct Node{
	int to;
	int next;
	int a;
}e[N];
int head[N];
int pd[N];
int dp[M][M];
int up(double x){
	int xx=x;
	if(x==xx) return xx;
	return xx+1;
}
void dij(){
	memset(dp,0x7f,sizeof(dp));
	int minj=1;
	int minn;
	pd[minj]=true;
	dp[1][0]=0;
	for(int i=1;i<=n;i++){
		for(int kk=0;kk<k;kk++){
			for(int j=head[minj];j;j=e[j].next){
				if(dp[minj][kk]+1>=e[i].a){
					dp[e[i].to][(kk+1)%k]=min(dp[e[i].to][(kk+1)%k],dp[minj][kk]+1);
				}else{
					int kkk=up((e[i].a-dp[minj][kk])/(k+0.0));
					dp[e[i].to][(kk+kkk*k)%k]=min(dp[e[i].to][(kk+kkk*k)%k],dp[minj][kk]+kk*k+kk);
				}
			}
			minn=0x7fffffff;
			pd[minj]=true;
			for(int j=head[minj];j;j=e[j].next){
				if(!pd[j]&&dp[e[i].to][kk]<minn){
					minn=dp[e[i].to][kk];
					minj=e[i].to;
				}
			}
		}
	}
}
int main(){
	cin>>n>>m>>k;
	int cnt=0;
	for(int i=1;i<=m;i++){
		int u,v,a;
		cin>>u>>v>>a;
		e[++cnt].next=head[u];
		head[u]=cnt;
		e[cnt].to=v;
		e[cnt].a=a; 
	}
	dij();
	if(dp[n][0]==2139062143){
		cout<<-1;
	}else
	cout<<dp[n][0];
	return 0; 
}
2023/11/18 20:22
加载中...