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

Posted mandy-h-y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于luogu 3946 ことりのおやつ(小鸟的点心)的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp yukicoder No.115远足のおやつ

c_cpp yukicoder No.115远足のおやつ

sh macOS Sierra自分なりの环境构筑スクリプト(通しで走らせたことがないので动くかは不明)

luogu1941 飞扬的小鸟

2018.07

luogu P1941 飞扬的小鸟