https://old.ynoip.cn/p/2612

psn  •  1年前


#include <cstdio>
#include <cstring>
using namespace std;
int n, m, q, x, y, d, mindis = 200000;
int vill[210][210], retime[220];
bool vied[220];

void dfs(int now, int total) {
	if (now == y) {
		if (total < mindis)
			mindis = total;
		return;
	}
	for (int i = 0; i < n; i++) {
		if (!vied[i] && vill[now][i] >= 0 && i != now) {
			vied[i] = true;
			dfs(i, vill[now][i] + total);
			vied[i] = false;
		}
	}
}

int main(void) {

	memset(vill, -1, sizeof(vill));

	scanf("%d%d", &n, &m);

	for (int i = 0; i < n; i++)
		scanf("%d", &retime[i]);
	for (int i = 0, a, b, c; i < m; i++) {
		scanf("%d%d%d", &a, &b, &c);
		vill[a][b] = c;
		vill[b][a] = c;
	}

	scanf("%d", &q);
	for (int i = 0; i < q; i++) {
		scanf("%d%d%d", &x, &y, &d);
		if (retime[x] > d || retime[y] > d) {
			printf("-1\n");
		} else {
			for (int u = 0; u < n; u++)
				if (retime[u] > d)
					vied[u] = true;
			dfs(x, 0);
			for (int u = 0; u < n; u++)
				vied[u] = false;
			if (mindis == 200000) {
				printf("-1\n");
				mindis = 200000;
			} else {
				printf("%d\n", mindis);
				mindis = 200000;
			}
		}
	}
	return 0;
}

评论:

请先登录,才能进行评论