比赛 NOIP模拟赛by mzx Day1 评测结果 WAWWWWWTTT
题目名称 零食店 最终得分 10
用户昵称 Tiny 运行时间 3.492 s
代码语言 C++ 内存使用 90.48 MiB
提交时间 2016-10-19 21:29:39
显示代码纯文本
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <queue>
  4.  
  5. const int MAX_BUF = 100 * 1024 * 1024;
  6. int buf_cnt = 0;
  7. char read_buf[MAX_BUF];
  8.  
  9. template <typename T> inline void Read_buf(T &num) {
  10. num = 0; bool minus = false;
  11. while (read_buf[buf_cnt] < '-' || read_buf[buf_cnt] > '9') ++buf_cnt;
  12. if (read_buf[buf_cnt] == '-') { minus = true; ++buf_cnt; }
  13. while (read_buf[buf_cnt] >= '0' && read_buf[buf_cnt] <= '9')
  14. num = num * 10 + read_buf[buf_cnt++] - '0';
  15. if (minus) num = -num;
  16. }
  17.  
  18. template <typename T> inline void Read(T &num) {
  19. num = 0; char ch; bool minus = false;
  20. while (ch = getchar(), ch < '-' || ch > '9');
  21. if (ch == '-') { minus = true; ch = getchar(); }
  22. while (num = num * 10 + ch - '0', ch = getchar(), ch >= '0' && ch <= '9');
  23. if (minus) num = -num;
  24. }
  25.  
  26. const size_t MAXN = 100 + 10, MAXM = 10000 + 10;
  27.  
  28. int n, m;
  29. int cost[MAXN];
  30. struct Edge { int v, w, ne; } E[MAXM << 1];
  31. int head[MAXN], tot_e = 0;
  32. int dis[MAXN];
  33.  
  34. struct Node {
  35. int t, w;
  36. inline bool operator <(const Node &b) const { return w > b.w; }
  37. };
  38. std::priority_queue<Node> Q;
  39.  
  40. inline void Insert(const int &u, const int &v, const int &w) {
  41. E[++tot_e] = (Edge){v, w, head[u]}; head[u] = tot_e;
  42. }
  43.  
  44. inline void Dijkstra(const int &s, const int &mc) {
  45. memset(dis, 0x3f, sizeof(dis));
  46. Q.push((Node){s, 0});
  47. dis[s] = 0;
  48. while (!Q.empty()) {
  49. Node u = Q.top(); Q.pop();
  50. if (dis[u.t] != u.w) continue;
  51. for (int i = head[u.t], v; i; i = E[i].ne) {
  52. v = E[i].v;
  53. if (dis[v] > u.w + E[i].w && cost[v] <= mc) {
  54. dis[v] = u.w + E[i].w;
  55. Q.push((Node){v, dis[v]});
  56. }
  57. }
  58. }
  59. }
  60.  
  61. int main() {
  62. #define SUBMIT
  63. #ifdef SUBMIT
  64. freopen("snackstore.in", "r", stdin);
  65. freopen("snackstore.out", "w", stdout);
  66. fread(read_buf, 1, MAX_BUF, stdin);
  67. #endif
  68.  
  69. int q; Read_buf(n); Read_buf(m); Read_buf(q);
  70. for (int i = 1; i <= n; ++i) Read_buf(cost[i]);
  71. int u, v, w;
  72. for (int i = 1; i <= m; ++i) {
  73. Read_buf(u); Read_buf(v); Read_buf(w);
  74. Insert(u, v, w); Insert(v, u, w);
  75. }
  76. while (q--) {
  77. Read_buf(u); Read_buf(v); Read_buf(w);
  78. Dijkstra(u, v);
  79. int ans = 1;
  80. for (int i = 1; i <= n; ++i)
  81. if (dis[i] <= w) ++ans;
  82. printf("%d\n", ans);
  83. }
  84.  
  85. #ifndef SUBMIT
  86. puts("\n--------------------");
  87. getchar(); getchar();
  88. #else
  89. fclose(stdin); fclose(stdout);
  90. #endif
  91. return 0;
  92. }