社区讨论

求助,A*打挂WA了

P2483【模板】k 短路 / [SDOI2010] 魔法猪学院参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@lo8o4m10
此快照首次捕获于
2023/10/27 21:47
2 年前
此快照最后确认于
2023/10/27 21:47
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define N 5005
#define INF 1234567890
using namespace std;
int head[N], head1[N], cnt, cnt1, n, m, ans, tot[N];
double h[N], E;
bool bz[N];
struct tu {
	int to, nxt; double w;
} e1[N << 2], e[N << 2];
struct node1 {
	int x; double sum;
	bool operator < (node1 a) const {
		return sum > a.sum;
	}
};
priority_queue<node1> q;
struct node {
	int x; double sum;
	bool operator < (node a) const {
		sum + h[x] > a.sum + h[a.x];
	}
};
priority_queue<node> Q;
void add(int u, int v, double w) {
	e[++cnt] = (tu) {v, head[u], w}; head[u] = cnt;
}
void add1(int u, int v, double w) {
	e1[++cnt1] = (tu) {v, head1[u], w}; head1[u] = cnt1;
}
int main() {
	scanf("%d%d%lf", &n, &m, &E);
	for (int i = 1; i <= m; ++i) {
		int x, y; double z;
		scanf("%d%d%lf", &x, &y, &z);
		add(x, y, z); add1(y, x, z);
	}
	for (int i = 1; i < n; ++i) h[i] = INF;
	q.push({n, 0});
	while (!q.empty()) {
		node1 u = q.top(); q.pop();
		if (bz[u.x]) continue;
		bz[u.x] = 1; h[u.x] = u.sum;
		for (int i = head1[u.x]; i; i = e1[i].nxt)
			q.push({e1[i].to, u.sum + e1[i].w});
	}
	int k = E / h[1]; Q.push({1, 0});
	while (!Q.empty()) {
		node u = Q.top(); Q.pop(); ++tot[u.x]; printf("%d\n", u.x);
		if (u.x == n) {
			E -= u.sum;
			if (E < 0) {
				printf("%d\n", ans); return 0;
			} ++ans;
		}
		for (int i = head[u.x]; i; i = e[i].nxt)
			if (tot[e[i].to] <= k && u.sum + e[i].w <= E) Q.push({e[i].to, u.sum + e[i].w});
	} printf("%d\n", ans);
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...