zoukankan      html  css  js  c++  java
  • 最短路【洛谷P3946】ことりのおやつ(小鸟的点心)

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

    滑完雪之后,ことり突然想吃点心啦!于是她去了甜品店。

    日本的冬天经常下雪。不幸的是,今天也是这样,每秒钟雪的厚度会增加q毫米。

    秋叶原共有n个地点,编号从1到n。每个地点在开始的时候的积雪高度为hi。

    有m条双向道路连接这些地点,它们的长度分别为wi米。

    雪太大,公共交通系统已经停摆了,所以ことり得走路回家。她走路的速度是1m/s。

    为了方便地图的绘制,秋叶原的道路规划使得每条道路严格地连接两个不同的地点,并且不会有两条道路连接的地点相同。

    每个地点都有一个极限雪高li,单位是毫米,如果到达这个地点的时候,这里的雪的高度高于li则会被困在这个点走不出去,无法成功地走到ことり家。

    点心店这个地点的编号是s,ことり家的编号是t。

    不考虑点心店和ことり家的雪。

    ことり想在g秒内回到家吃点心,越快越好。如果在g秒之内,ことり无法到家,或者她被困在路上了,那么ことり会把wtnap变成她的点心( ・ 8 ・ )

    再跑Dij的时候判断一下从u到v是否会超过高度限制。。

    注意如果v是t的话就算超过限制了也可以走。

    ZAGER说这叫死在终点。。。

    code:

    #include <iostream>
    #include <cstdio>
    #include <queue>
    #include <algorithm>
    
    using namespace std;
    
    const int wx=800017;
    
    inline int read(){
    	int sum=0,f=1; char ch=getchar();
    	while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
    	while(ch>='0'&&ch<='9'){sum=(sum<<1)+(sum<<3)+ch-'0'; ch=getchar();}
    	return sum*f;
    }
    
    int head[wx],dis[wx],vis[wx];
    int hh[wx],h[wx],l[wx];
    int num,n,m,s,t,g,qq;
    
    struct e{
    	int nxt,to,dis;
    }edge[wx*2];
    
    void add(int from,int to,int dis){
    	edge[++num].nxt=head[from];
    	edge[num].to=to;
    	edge[num].dis=dis;
    	head[from]=num;
    }
    
    struct node{
    	int u,d;
    	friend bool operator < (const node & a,const node & b){
    		return a.d>b.d;
    	}
    };
    
    
    priority_queue<node > q;
    void Dij(){
    	for(int i=1;i<=n;i++)dis[i]=0x3f3f3f3f,vis[i]=0;
    	dis[s]=0; hh[s]=h[s]; q.push((node){s,0});
    	while(q.size()){
    		int u=q.top().u; q.pop();
    		if(vis[u])continue; vis[u]=1;
    		for(int i=head[u];i;i=edge[i].nxt){
    			int v=edge[i].to;
    			if(qq*dis[u]+h[v]>l[v]&&v!=t)continue;
    			if(dis[v]>dis[u]+edge[i].dis){
    				dis[v]=dis[u]+edge[i].dis;
    				q.push((node){v,dis[v]});
    			}
    		}
    	}
    }
    
    int main(){
    	n=read(); m=read(); s=read(); t=read(); g=read(); qq=read();
    	for(int i=1;i<=n;i++)h[i]=read(),l[i]=read();
    	for(int i=1;i<=m;i++){
    		int x,y,z;
    		x=read(); y=read(); z=read();
    		add(x,y,z); add(y,x,z);
    	}
    	Dij();
    	if(dis[t]>g)puts("wtnap wa kotori no oyatsu desu!");
    	else printf("%d
    ",dis[t]);
    	return 0;
    }
    
  • 相关阅读:
    一个诡异的COOKIE问题
    PHP与JAVA构造函数的区别
    PHP获取上个月最后一天的一个容易忽略的问题
    jquery屏幕滚动计算事件总结
    Javascript 代理模式模拟一个文件同步功能
    Javascript实现HashTable类
    Javacript实现字典结构
    Javascript正则对象方法与字符串正则方法总结
    一个app,多个入口图标,activity-alias实现多程序入口并显示指定view完成
    javascript「篱式」条件判断
  • 原文地址:https://www.cnblogs.com/wangxiaodai/p/9830276.html
Copyright © 2011-2022 走看看