题意: 解法: 最短路裸题. 唯一变化的点是边权是变化的, 对于x->(v,t,k),边权为(k-dist[x]%k)%k+t. 其他地方就是普通最短路,用dj算法求解即可. code: #include<bits/stdc++.h> #define int long long #define PI pair<int,int> using namespace std; const int maxm=2e6+5; struct Node{ int v,t,k; }; vector<Node>g[maxm]; int mark[maxm]; int dist[maxm]; int n,m,x,y; void dj(int st){ for(int i=1;i<=n;i++)dist[i]=1e18; dist[st]=0; priority_queue<PI,vector<PI>,greater<PI> >q; q.push({dist[st],st}); while(q.size()){ int x=q.top().second;q.pop(); if(mark[x])continue; mark[x]=1; for(auto i:g[x]){ int v=i.v,t=i.t,k=i.k; int time=(k-dist[x]%k)%k+t; if(dist[v]>dist[x]+time){ dist[v]=dist[x]+time; q.push({dist[v],v}); } } } } void solve(){ cin>>n>>m>>x>>y; for(int i=1;i<=m;i++){ int a,b,t,k;cin>>a>>b>>t>>k; g[a].push_back({b,t,k}); g[b].push_back({a,t,k}); } dj(x); int ans=dist[y]; if(ans==1e18)ans=-1; cout<<ans<<endl; } signed main(){ solve(); return 0; }