zoukankan      html  css  js  c++  java
  • luogu 3946 ことりのおやつ(小鸟的点心)

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

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

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

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

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

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

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

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

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

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

    输入格式

    第1行6个整数,空格隔开,分别代表n,m,s,t,g,q。

    以下n行,每行2个整数,空格隔开,分别表示这个地点的hi和li。

    以下m行,每行3个整数,空格隔开,分别表示这条路连接的两个地点u, v和这条路的长度wi。

    输出格式

    输出1行1个整数,表示到达ことり家的最短用时。

    如果wtnap变成了ことり的点心那么输出"wtnap wa kotori no oyatsu desu!"

    输出时不含引号。

    输入输出样例

    输入 #1
    2 1 1 2 10 1
    1 10
    3 10
    1 2 6
    输出 #1
    6
    输入 #2
    5 6 2 5 10 1
    1 10
    1 10
    1 10
    1 10
    1 10
    1 5 9
    1 3 9
    2 4 1
    2 5 9
    3 4 1
    3 5 6
    输出 #2
    8
    输入 #3
    5 6 2 5 10 1
    1 10
    1 10
    10 10
    1 10
    1 10
    1 5 9
    1 3 9
    2 4 1
    2 5 11
    3 4 1
    3 5 6
    
    输出 #3
    wtnap wa kotori no oyatsu desu!

    说明/提示对于0%的数据,与样例一模一样;
    对于40%的数据,q = 0。
    对于上一行中50%的数据,所有wi < li。
    对于100%的数据,1 ≤ s, t ≤ n; 0 ≤ g, q ≤ 10^9; 0 ≤ wi ≤ li ≤ 10^9。

    分析

    这道题,在更新松弛的时候注意判断是否高于雪线就好

    注意读题:

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

    所以要特判

    读题的重要性

    代码

      1 /**********************
      2 User:Mandy.H.Y
      3 Language:c++
      4 Problem:luogu
      5 Algorithm: 
      6 **********************/
      7 #include<bits/stdc++.h>
      8 
      9 using namespace std;
     10 
     11 const int maxn = 1e5 + 5;
     12 const int maxm = 5e5 + 5;
     13 
     14 int n,m,s,t,g,Q,size;
     15 int first[maxn];
     16 int h[maxn],l[maxn];
     17 int dis[maxn];
     18 bool vis[maxn];
     19 
     20 struct Edge{
     21     int v,w,nt;
     22 }edge[maxm <<  1];
     23 
     24 template<class T>inline void read(T &x){
     25     x = 0;bool flag = 0;char ch = getchar();
     26     while(!isdigit(ch)) flag |= ch == '-',ch = getchar();
     27     while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48),ch = getchar();
     28     if(flag) x = -x;
     29 }
     30 
     31 template<class T>void putch(const T x){
     32     if(x > 9) putch(x / 10);
     33     putchar(x % 10 | 48);
     34 }
     35 
     36 template<class T>void put(const T x){
     37     if(x < 0) putchar('-'),putch(-x);
     38     else putch(x);
     39 }
     40 
     41 void file(){
     42     freopen("3946.in","r",stdin);
     43     freopen("3946.out","w",stdout);
     44 }
     45 
     46 void eadd(int u,int v,int w){
     47     edge[++size].v = v;
     48     edge[size].w = w;
     49     edge[size].nt = first[u];
     50     first[u] = size;
     51 }
     52 
     53 void readdata(){
     54     read(n);read(m);read(s);read(t);read(g);read(Q);
     55     for(int i = 1; i <= n; ++ i){
     56         read(h[i]);read(l[i]); 
     57     }
     58     for(int i = 1; i <= m; ++ i){
     59         int u,v,w;
     60         read(u);read(v);read(w);
     61         eadd(u,v,w);
     62         eadd(v,u,w);
     63     }
     64 }
     65 
     66 bool Dijkstra(){
     67     memset(dis,0x3f3f3f3f,sizeof(dis));
     68     typedef pair<int,int> pir;
     69     priority_queue<pir,vector<pir>,greater<pir> >q;
     70     q.push(make_pair(0,s));
     71     dis[s] = 0;
     72     while(!q.empty()){
     73         int u = q.top().second;
     74         q.pop();
     75         if(vis[u]) continue;
     76         vis[u] = 1;
     77         for(int i = first[u];i;i = edge[i].nt){
     78             int v = edge[i].v;
     79             int w = edge[i].w;
     80             if((dis[u] + w) * Q + h[v] > l[v] && v != t) continue;
     81             //不考虑点心店的雪 
     82             if(dis[u] + w < dis[v]){
     83                 dis[v] = dis[u] + w;
     84                 q.push(make_pair(dis[v],v));
     85             }
     86         }
     87     }
     88     if(dis[t] != 0x3f3f3f3f && dis[t] <= g) return 1;
     89     //不考虑点心店的雪 
     90     else return 0;
     91 }
     92 
     93 void work(){
     94     if(Dijkstra()) put(dis[t]);
     95     else puts("wtnap wa kotori no oyatsu desu!");
     96     
     97 }
     98 
     99 int main(){
    100 //    file();
    101     readdata();
    102     work();
    103     return 0;
    104 }
    View Code
  • 相关阅读:
    数据库中两张表之间的数据同步实现思路(增加、删除、更新)Mysql、sqlserver
    多台服务器之间如何让sqlserver,mysql数据库进行数据同步?
    mysql数据库同步时数据一致性的配置优化
    mysql 、sqlserver数据库,实时同步,增量同步(脚本模式)
    SyncNavigator 注册机 使用教程
    SyncNavigator数据库同步软件8.4.1 中文版
    HKROnline SyncNavigator破解版企业版 8.4.1 注册机使用教程
    SyncNavigator 破解版8.4.1 企业版 授权注册流程
    浅谈数据库高可用性(HA)技术
    软件工程第七周总结
  • 原文地址:https://www.cnblogs.com/Mandy-H-Y/p/11461289.html
Copyright © 2011-2022 走看看