社区讨论
萌新刚学A* WA10pts 求调!玄关
P4467[SCOI2007] k短路参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m5j1lk0k
- 此快照首次捕获于
- 2025/01/05 11:17 去年
- 此快照最后确认于
- 2025/11/04 11:57 4 个月前
AC on #2, 其余WA
code:
CPP#include <bits/stdc++.h>
#define N 20005
using namespace std;
typedef pair<int, int> PI;
typedef pair<int, PI> PII;
int n, m, s, t, k, x, y, len, idx = 0, pre1[N], pre2[N], dis[N], cnt[N];
bool vis[N];
struct node
{
int to, next, len;
} a[N];
void add(int pre[], int u, int v, int len)
{
a[++idx] = {v, pre[u], len};
pre[u] = idx;
}
void dijkstra()
{
priority_queue<PI, vector<PI>, greater<PI>> heap;
memset(dis, 127, sizeof dis);
dis[t] = 0;
heap.push(make_pair(0, t));
while (heap.size())
{
PI u = heap.top();
heap.pop();
auto [d, p] = u;
if (vis[p])
continue;
vis[p] = true;
for (int i = pre2[p]; i; i = a[i].next)
{
int to = a[i].to;
if (d + a[i].len < dis[to])
{
dis[to] = d + a[i].len;
heap.push(make_pair(d + a[i].len, to));
}
}
}
}
void a_star()
{
priority_queue<PII, vector<PII>, greater<PII>> heap;
heap.push(make_pair(dis[s], make_pair(0, s)));
while (heap.size())
{
PII u = heap.top();
heap.pop();
auto [d, p] = u.second;
cnt[p]++;
if (cnt[p] == k && p != t)
printf("%d-", p);
if (cnt[t] == k)
{
printf("%d", d);
return;
}
for (int i = pre1[p]; i; i = a[i].next)
{
int to = a[i].to;
if (cnt[to] < k)
heap.push(make_pair(d + a[i].len + dis[to], make_pair(d + a[i].len, to)));
}
}
printf("No");
}
int main()
{
scanf("%d%d%d%d%d", &n, &m, &k, &s, &t);
while (m--)
{
scanf("%d%d%d", &x, &y, &len);
add(pre1, x, y, len);
add(pre2, y, x, len);
}
dijkstra();
a_star();
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...