注意避免重边。
vector 存储。
#include<bits/stdc++.h> using namespace std; #define maxn 50005 #define inf 0x3f3f3f3f struct node { int v,w,a,b; } temp; vector<node>mmp[maxn]; int dis[maxn],n,m,s,t,top; bool vis[maxn]; void spfa() { memset(vis,0,sizeof(vis)); dis[s]=0; vis[s]=1; queue<int>q; q.push(s); while(!q.empty()) { top=q.front(); q.pop(); vis[top]=0; for(int i=0; i<mmp[top].size(); i++) { int pp=dis[top]%(mmp[top][i].a+mmp[top][i].b),ww; if(pp<mmp[top][i].a) { if(mmp[top][i].a-pp>=mmp[top][i].w) ww=mmp[top][i].w; else ww=mmp[top][i].w+mmp[top][i].a+mmp[top][i].b-pp; } else ww=mmp[top][i].w+mmp[top][i].a+mmp[top][i].b-pp; if(dis[top]+ww<dis[mmp[top][i].v]) { if(!vis[mmp[top][i].v]) { vis[mmp[top][i].v]=1; q.push(mmp[top][i].v); } dis[mmp[top][i].v]=dis[top]+ww; } } } } int main() { int u,v,a,b,w,cnt=1; while(cin>>n>>m>>s>>t) { for(int i=1; i<=n; i++) { mmp[i].clear(); dis[i]=inf; } while(m--) { cin>>u>>v>>a>>b>>w; if(w<=a) { temp.v=v; temp.a=a; temp.b=b; temp.w=w; mmp[u].push_back(temp); } } spfa(); cout<<"Case "<<cnt++<<": "<<dis[t]<<endl; } return 0; }