社区讨论
求助A*打挂,一个点都没过,原数据全WA
P2483【模板】k 短路 / [SDOI2010] 魔法猪学院参与者 2已保存回复 7
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 7 条
- 当前快照
- 1 份
- 快照标识符
- @lo8o3xs0
- 此快照首次捕获于
- 2023/10/27 21:47 2 年前
- 此快照最后确认于
- 2023/10/27 21:47 2 年前
CPP
#include<bits/stdc++.h>
#define N 200005
#define INF 12345678910
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], e[N];
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});
//for (int i = 1; i <= n; ++i) printf("%d\n", head[i]);
while (!Q.empty()) {
node u = Q.top(); Q.pop(); ++tot[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;
}
回复
共 7 条回复,欢迎继续交流。
正在加载回复...