RT,代码:
#include<iostream>
#include<vector>
#include<cmath>
#include<queue>
using namespace std;
struct node{
vector<int> to,arrive;
}G[10001];
int n,m,k;
struct bfs_node{
int nownode;
long long nowtime;
bfs_node(int _i,int _t):nownode(_i),nowtime(_t){
}
bool operator<(const bfs_node &rhs) const{return nowtime<rhs.nowtime;}
bool operator>(const bfs_node &rhs) const{
return nowtime>rhs.nowtime;
}
};
bool vis[10001][101];
int bfs(){
priority_queue<bfs_node,vector<bfs_node>,greater<bfs_node> > q;
q.push(bfs_node(1,0));
long long minn=100000000000ll;
while(q.size()){
bfs_node fnt=q.top();
// cout << "fnt.time=" << fnt.nowtime << ".\n";
q.pop();
if(fnt.nownode==n){
if(fnt.nowtime%k==0) minn=min(minn,fnt.nowtime);
continue;
}
if(vis[fnt.nownode][fnt.nowtime%k]) continue;
vis[fnt.nownode][fnt.nowtime%k]=true;
for(int i=0,siz=G[fnt.nownode].to.size();i<siz;i++){
int t=fnt.nowtime+1;
if(vis[G[fnt.nownode].to[i]][t%k]) continue;
if(t<G[fnt.nownode].arrive[i]){
int tmp=G[fnt.nownode].arrive[i]-t;
if(tmp%k==0){
t+=tmp;
} else{
t+=(tmp/k+1)*k;
}
}
q.push(bfs_node(G[fnt.nownode].to[i],t));
// cout << "q.siz=" << q.size() << ".\n";
}
}
return (minn==100000000000ll?-1:minn);
}
int main(){
// freopen("bus.in","r",stdin);
// freopen("bus.out","w",stdout);
cin >> n >> m >> k;
for(int i=0;i<m;i++){
int u,v,w;
cin >> u >> v >> w;
G[u].to.push_back(v);
G[u].arrive.push_back(w);
}
cout << bfs();
fclose(stdin);
fclose(stdout);
return 0;
}
另,要怎么改qwq