ことりのおやつ(小鸟的点心)

滑完雪之后,ことり突然想吃点心啦!于是她去了甜品店。
日本的冬天经常下雪。不幸的是,今天也是这样,每秒钟雪的厚度会增加q毫米。
秋叶原共有n个地点,编号从1到n。每个地点在开始的时候的积雪高度为hi。
有m条双向道路连接这些地点,它们的长度分别为wi米。
雪太大,公共交通系统已经停摆了,所以ことり得走路回家。她走路的速度是1m/s。
为了方便地图的绘制,秋叶原的道路规划使得每条道路严格地连接两个不同的地点,并且不会有两条道路连接的地点相同。
每个地点都有一个极限雪高li,单位是毫米,如果到达这个地点的时候,这里的雪的高度高于li则会被困在这个点走不出去,无法成功地走到ことり家。
点心店这个地点的编号是s,ことり家的编号是t。
不考虑点心店和ことり家的雪。
ことり想在g秒内回到家吃点心,越快越好。如果在g秒之内,ことり无法到家,或者她被困在路上了,那么ことり会把wtnap变成她的点心( ・ 8 ・ )

SPFA统计降雪量,超过的不能走,特判重点。

#include<bits/stdc++.h>
using namespace std;

#define ll long long
const int MAXN=6e5+5;
const ll INF=1e18+7;

struct edge{
    ll to,next,w;
}e[MAXN<<1];

ll head[MAXN],cnt=0;
inline void add(ll u,ll v,ll w){e[++cnt]=(edge){v,head[u],w},head[u]=cnt;}

queue<ll>que;
ll dis[MAXN],n,m,s,t,d,q,hi,li,xz[MAXN];
bool vis[MAXN];

void SPFA(ll x){
    memset(vis,0,sizeof(vis));
    dis[x]=0;
    que.push(x);vis[x]=1;
    while(que.size()){
        ll u=que.front();que.pop();vis[u]=0;
        for(ll i=head[u];i;i=e[i].next){
            ll v=e[i].to,w=e[i].w;
            if((dis[u]+w<dis[v]&&dis[u]*q+w*q<=xz[v])||(dis[u]+w<dis[v]&&v==t)){
                dis[v]=dis[u]+w;
                if(!vis[v]){
                    que.push(v);vis[v]=1;
                }
            }
        }
    //  cout<<endl;
    }
}

int main(){
    scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&s,&t,&d,&q);
    for(ll i=1;i<=n;i++){
        scanf("%lld%lld",&hi,&li);
        xz[i]=li-hi;
    }
    for(ll i=1;i<=m;i++){
        ll u,v,w;
        scanf("%lld%lld%lld",&u,&v,&w);
        add(u,v,w);add(v,u,w);
    }
    for(ll i=1;i<=n;i++)dis[i]=INF;
    SPFA(s);
    if(dis[t]<=d)printf("%lld\n",dis[t]);
    else printf("wtnap wa kotori no oyatsu desu!\n");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值