社区讨论
求助大佬,第三个点出0...
P4568[JLOI2011] 飞行路线参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mi7pcavd
- 此快照首次捕获于
- 2025/11/21 01:25 4 个月前
- 此快照最后确认于
- 2025/11/21 01:25 4 个月前
大佬们,第三个点输出0是什么情况啊,91分只有第三个点没过。
CPP// luogu-judger-enable-o2
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <queue>
#include <cmath>
using namespace std;
const int N = 20000;
const int K = 30;
const int M = 60010;
const int INF = 2147483646;
int n, m, k, a, b, c, ec, u, dis[N * K], f[N * K], vis[K * N], ans = INF, s, t;
struct Edge
{
int u, v, w, nxt;
}e[M * K];
struct Node
{
int id, w;
bool operator < (const Node &b) const
{ return w > b.w; }
};
inline void Addedge(int a, int b, int c)
{
++ec;
e[ec].u = a;
e[ec].v = b;
e[ec].w = c;
e[ec].nxt = f[a];
f[a] = ec;
}
inline void read(int &x)
{
int k = 1; x = 0;
char c = getchar();
while (!isdigit(c))
if (c == '-') c = getchar(), k = -1;
else c = getchar();
while (isdigit(c))
x = (x << 1) + (x << 3) + (c ^ 48),
c = getchar();
x *= k;
}
inline void Dijkstra()
{
for (int i = 1; i <= k * n + n; ++i) dis[i] = INF; dis[s] = 0;
priority_queue <Node> Q; Q.push((Node){s, 0});
while (!Q.empty())
{
u = Q.top().id; Q.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = f[u]; i != -1; i = e[i].nxt)
if (dis[e[i].v] > dis[u] + e[i].w)
dis[e[i].v] = dis[u] + e[i].w,
Q.push((Node){e[i].v, dis[e[i].v]});
}
for (int i = 0; i <= k; ++i)
ans = min(ans, dis[i * n + t]);
printf("%d\n", ans);
}
inline void Init()
{
memset(f, -1, sizeof(f));
read(n), read(m), read(k); read(s), read(t); ++s, ++t;
for (int i = 1; i <= m; ++i)
{
read(a), read(b), read(c), ++a, ++b;
for (int j = 0; j <= k; ++j)
Addedge(a + j * n, b + j * n, c),
Addedge(b + j * n, a + j * n, c);
for (int j = 0; j < k; ++j)
Addedge(a + j * n, b + (j + 1) * n, 0),
Addedge(b + j * n, a + (j + 1) * n, 0);
}
}
signed main()
{
Init(), Dijkstra(); return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...