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!"
输出时不含引号。
输入输出样例
2 1 1 2 10 1 1 10 3 10 1 2 6
6
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
8
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
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
以上是关于luogu 3946 ことりのおやつ(小鸟的点心)的主要内容,如果未能解决你的问题,请参考以下文章