注意避免重边。
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;
}
7万+

被折叠的 条评论
为什么被折叠?



