P
r
o
b
l
e
m
l
i
n
k
Problem~link
Problem link
分析:
直接上
s
p
f
a
spfa
spfa
松弛时先看雪是否过厚 再选择入队
CODE:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
typedef long long ll;
const int N=5e5+5;
int n,m,s,t,g,q,tot;
int vis[N],h[N],l[N],head[N],dis[N];
queue<int> que;
struct node{
int to,next,k;
}a[N<<1];
void add(int x,int y,int k)
{
a[++tot]=(node){y,head[x],k};
head[x]=tot;
}
void spfa(int st)
{
memset(dis,0x3f,sizeof dis);
vis[st]=1;
dis[st]=0;
que.push(st);
while(!que.empty())
{
int x=que.front();
que.pop();
vis[x]=0;
for(int i=head[x];i;i=a[i].next)
{
int qwq=a[i].to;
if(dis[qwq]>dis[x]+a[i].k)
{
dis[qwq]=a[i].k+dis[x];
if(vis[qwq]) continue;
if(l[qwq]>=h[qwq]+dis[qwq]*q)
{
vis[qwq]=1;
que.push(qwq);
}
}
}
}
}
int main()
{
scanf("%d%d%d%d%d%d",&n,&m,&s,&t,&g,&q);
for(int i=1;i<=n;i++)
scanf("%d%d",&h[i],&l[i]);
for(int i=1,x,y,w;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&w);
add(x,y,w);
add(y,x,w);
}
spfa(s);
if(dis[t]>g) puts("wtnap wa kotori no oyatsu desu!");
else printf("%d",dis[t]);
return 0;
}