比赛 NOIP模拟赛by mzx Day1 评测结果 WAWWWWWTTT
题目名称 零食店 最终得分 10
用户昵称 Tiny 运行时间 3.492 s
代码语言 C++ 内存使用 90.48 MiB
提交时间 2016-10-19 21:29:39
显示代码纯文本
#include <stdio.h>
#include <string.h>
#include <queue>

const int MAX_BUF = 100 * 1024 * 1024;
int buf_cnt = 0;
char read_buf[MAX_BUF];

template <typename T> inline void Read_buf(T &num) {
	num = 0; bool minus = false;
	while (read_buf[buf_cnt] < '-' || read_buf[buf_cnt] > '9') ++buf_cnt;
	if (read_buf[buf_cnt] == '-') { minus = true; ++buf_cnt; }
	while (read_buf[buf_cnt] >= '0' && read_buf[buf_cnt] <= '9')
		num = num * 10 + read_buf[buf_cnt++] - '0';
	if (minus) num = -num;
}

template <typename T> inline void Read(T &num) {
	num = 0; char ch; bool minus = false;
	while (ch = getchar(), ch < '-' || ch > '9');
	if (ch == '-') { minus = true; ch = getchar(); }
	while (num = num * 10 + ch - '0', ch = getchar(), ch >= '0' && ch <= '9');
	if (minus) num = -num;
}

const size_t MAXN = 100 + 10, MAXM = 10000 + 10;

int n, m;
int cost[MAXN];
struct Edge { int v, w, ne; } E[MAXM << 1];
int head[MAXN], tot_e = 0;
int dis[MAXN];

struct Node {
	int t, w;
	inline bool operator <(const Node &b) const { return w > b.w; }
};
std::priority_queue<Node> Q;

inline void Insert(const int &u, const int &v, const int &w) {
	E[++tot_e] = (Edge){v, w, head[u]}; head[u] = tot_e;
}

inline void Dijkstra(const int &s, const int &mc) {
	memset(dis, 0x3f, sizeof(dis));
	Q.push((Node){s, 0});
	dis[s] = 0;
	while (!Q.empty()) {
		Node u = Q.top(); Q.pop();
		if (dis[u.t] != u.w) continue;
		for (int i = head[u.t], v; i; i = E[i].ne) {
			v = E[i].v;
			if (dis[v] > u.w + E[i].w && cost[v] <= mc) {
				dis[v] = u.w + E[i].w;
				Q.push((Node){v, dis[v]});
			}
		}
	}
}

int main() {
 #define SUBMIT
 #ifdef SUBMIT
	freopen("snackstore.in", "r", stdin);
	freopen("snackstore.out", "w", stdout);
	fread(read_buf, 1, MAX_BUF, stdin);
 #endif

	int q; Read_buf(n); Read_buf(m); Read_buf(q);
	for (int i = 1; i <= n; ++i) Read_buf(cost[i]);
	int u, v, w;
	for (int i = 1; i <= m; ++i) {
		Read_buf(u); Read_buf(v); Read_buf(w);
		Insert(u, v, w); Insert(v, u, w);
	}
	while (q--) {
		Read_buf(u); Read_buf(v); Read_buf(w);
		Dijkstra(u, v);
		int ans = 1;
		for (int i = 1; i <= n; ++i)
			if (dis[i] <= w) ++ans;
		printf("%d\n", ans);
	}

 #ifndef SUBMIT
	puts("\n--------------------");
	getchar(); getchar();
 #else
	fclose(stdin); fclose(stdout);
 #endif
	return 0;
}